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!

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top