Differenza di SHA1 in .NET e MySQL
-
29-09-2019 - |
Domanda
Ho un paio di diversi pezzi di codice, ma il racconto è inserisco alcune password in un database MySQL utilizzando SHA1 e anche hash SHA1 di elaborazione in .NET e loro non sono corrispondenti. Penso che questo sia un problema con il mio codice di codifica in .NET.
Codice SQL:
INSERT INTO user_credentials (Password) VALUES (SHA1('password'));
hash delle password per 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
Codice NET:
public static string GetPasswordHash(string password)
{
// problem here with encoding?
byte[] byteArray = Encoding.ASCII.GetBytes(password);
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] hashedPasswordBytes = sha.ComputeHash(byteArray);
return Encoding.ASCII.GetString(hashedPasswordBytes);
}
hash delle password per [? un ??????% l? 3 ~ ???
Grazie per qualsiasi aiuto!
Soluzione
Nell'esempio MySQL si codifica a un esadecimale stringa, nell'esempio .NET si sono codifica in ASCII. I due codifiche non sono gli stessi.
Se si converte in esadecimale nella versione di .NET si ottiene il risultato corretto:
string hex = BitConverter.ToString(hashedPasswordBytes);
Risultato:
5B-AA-61-E4-C9-B9-3F-3F-06-82-25-0B-6C-F8-33-1B-7E-E6-8F-D8
Altri suggerimenti
Hai bisogno di mettere [?a??????%l?3~???
in HEX la rappresentazione. Quello che si stampa è probabilmente in formato binario (da qui le molteplici caratteri ?
).
Prova a fare questo:
string hexstring = BitConverter.ToString(hashedPasswordBytes);
E vedere se hexstring
e MySQL hash partita.
Di seguito vi darà una corrispondenza esatta di ciò che produce MySQL:
BitConverter.ToString(SHA1CryptoServiceProvider.Create().ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Password))).Replace("-", "").ToLower();
Gli hash SHA1 dovrebbe essere uguale, ma la rappresentazione non è. MySql emette un hex-stringa, quindi è necessario fare lo stesso in .NET:
return String.Join(String.Empty, hashedPasswordBytes.Select(b => b.ToString("x2")))
Come è la vostra tabella di MySQL / banca dati codificato? Prova a impostare sia a UTF-8 (quindi utilizzando Encoding.UTF8.GetBytes)