30. juli 2004 - 09:42
Der er
17 kommentarer og 1 løsning
Konvertere imellem encodings
Jeg har fået smidt en Base64 string i min DB, som repræsenterer et krypteret password. Hvordan får jeg det gendannet til mit normale password? Jeg har både kryptering og dekrypteringsmetoden, men jeg formoder at jeg fejler i nogle encodings. (da jeg er ret ny i dette felt) while(reader.Read()){ Console.WriteLine(Decrypt(new UTF8Encoding().GetBytes(reader.GetString(0)))); } Jeg gætter på at det er Base64 og UTF8Encoding som ikke matcher, men jeg er tabt i hvordan det så gøres.
Annonceindlæg fra Computerworld
Har du "fundet" Convert ToBase64String og FromBase64String ?
Hehe ja dem har jeg set, men fik fejlen "Ugyldigt tegn i en Base-64-streng". Mine erklæringer ser sådan her ud: static byte[] iv = { 1, 2, 3, 4, 100, 6, 4, 8, 9, 10, 11, 12, 13, 14, 15, 1 }; static Encoding utf = new UTF8Encoding(); static byte[] key = utf.GetBytes("dfgrgerg"); static DES des = new DESCryptoServiceProvider(); static string Encrypt(string input){ ICryptoTransform encrypt = des.CreateEncryptor(key, iv); byte[] array = encrypt.TransformFinalBlock(utf.GetBytes(input), 0, utf.GetByteCount(input)); return Convert.ToBase64String(array); } static string Decrypt(byte[] cipher){ ICryptoTransform decrypt = des.CreateDecryptor(key, iv); return utf.GetString(decrypt.TransformFinalBlock(cipher, 0, cipher.Length)); }
Du får vel fejlen i FromBase64String ? Og hvor kalder du den ?
jeg ville nok lave det som: static string Decrypt(String input){ byte[] cipher = Convert.FromBase64String(input); ICryptoTransform decrypt = des.CreateDecryptor(key, iv); return utf.GetString(decrypt.TransformFinalBlock(cipher, 0, cipher.Length)); }
"Længden af de data der skal dekrypteres er ugyldig" først udfører jeg denne sql: string.Format("UPDATE person SET password = '{0}' WHERE id='{1}';",Encrypt(iEnum.Value.ToString()), iEnum.Key); derefter denne: dbPage.Sql = "SELECT id, password FROM person;"; IDataReader reader = dbPage.GetIDataReader(); while(reader.Read()) Console.WriteLine(reader.GetString(0)+ " " + Decrypt(reader.GetString(1)));
Umiddelbart ser det OK *hvis* alle PW er krypteret.
en hurtig SELECT giver dette: SbRBAZU46X9bhOeSVo3C98KDNgxcj7hff/4PlFJwN9Qzjv8DU01IErVUgFf7BlDrCXDzdXzWY3U= så noget er altså blevet krypteret på et eller andet plan ;-)
Jo men der er ikke nogen WHERE på SELECT så den returnerer alle records. Hvis der er en ikke krypteret (udover den krypterede) så ... Ellers check længden før du gemme rog efter du har hentet og sammenlign.
kodeudsnit: static string Encrypt(string input){ ... Console.WriteLine("EN:"+Convert.ToBase64String(array).Length); .. } static string Decrypt(string input){ Console.WriteLine("DE:"+input.Length); ... } Resultat: EN = 24 DE = 48 ved du hvordan det kan være? SQL: password BLOB det benyttede password til denne test er 'kode'
30. juli 2004 - 12:01
#10
Hvis du konverterer til base64 string kan du godt bruge varchar !
30. juli 2004 - 12:01
#11
Jeg er ret sikker på at du får gemt i db med 1 char = 2 bytes og hentet fra db med 1 char = 1 byte.
05. august 2004 - 15:20
#12
hmm ja, men hvor regulerer men det? Jeg har ikke bevidst korregeret noget...
05. august 2004 - 22:50
#13
Kan du lave et lille standalone program som kan genskabe problemet. Det er sikkert helt banalt. Men lidt svært at kredse sig ind på.
05. august 2004 - 23:13
#14
jo klart - man bliver bare så doven af at være spørger på eksperten ;-)
06. august 2004 - 08:54
#15
Ok, problemt lå i at jeg ikke havde fået ændret datatypen fra BLOB til VARCHAR i db endnu... Takker
06. august 2004 - 09:21
#16
Ah !
06. august 2004 - 09:21
#17
OK at jeg ligger et svar så ?
06. august 2004 - 09:53
#18
Klart
Kurser inden for grundlæggende programmering