Frage

Ich habe in ein interessantes Thema laufen .. Es scheint, dass ComputeHash () für eine „HMACSHA256“ hash nicht deterministisch verhält .. wenn ich schaffe zwei Instanzen von HashAlgorithm HashAlgorithm.Create mit ( „HMACSHA256“) .. Und Lauf ComputeHash, ich zwei unterschiedliche Ergebnisse erhalten .. unten ist ein Beispiel statische Klasse, die dieses Verhalten zeigen.

internal static string HashPassword(byte[] bAll)
{
    using (HashAlgorithm s = HashAlgorithm.Create("HMACSHA256"))
    {
        return Convert.ToBase64String(s.ComputeHash(bAll));
    }
}

Ich habe auch versucht, den Anruf nicht statisch zu machen (es begann eigentlich nicht statisch, und ich habe doppelt und dreifach und quadrudruple überprüfte meine Eingabe-Array .. sein absolut das gleiche bei jedem Aufruf .. Ich habe auch getan Sachen im immidiate Fenster wie:

Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll)

Und läuft doppelt so hoch wie im immidiates Fenster über einen Haltepunkt in der Methode gibt zwei unterschiedliche Hashes ..

Ich weiß, dass Hash suppose ist deterministisch zu sein .. Also, was soll das? ist etwas los mit in einem Debugger ausgeführt wird? Oder irgendwelche anderen Ideen? wirklich dieses Recht jetzt Worte nur zwei seltsam ist :-P ..

Danke Josh

War es hilfreich?

Lösung

HMAC ist ein verschlüsselter Hash. Ich habe nicht den Schlüssel in Ihrem Beispiel-Code sehen.

HashAlgorithm.Create("HMACSHA256") erstellt eine HashAlgorithm Instanz, so dass er nichts von einem Schlüssel nicht kennt. Wahrscheinlich ruft nur dieser HMACSHA256 Constructor :

public HMACSHA256()

Initialisiert eine neue Instanz der Klasse HMACSHA256 mit einem zufällig generierten Schlüssel .

Sie wollen diesen Konstruktor :

public HMACSHA256(byte[] key)

Initialisiert eine neue Instanz der HMACSHA256 Klasse mit den angegebenen Schlüsseldaten.

Wenn Sie wollen nicht zu hart Code des HMAC-Algorithmus, können Sie KeyedHashAlgorithm.Create und einen bestimmten Schlüssel liefern, indem Sie die KeyedHashAlgorithm.Key Eigenschaft.

Wenn Sie keinen Schlüssel verwenden möchten, dann verwenden Sie einen nicht-verschlüsselten Hash wie SHA256.

Andere Tipps

Nur um diese Zugabe in der Hoffnung, jemand die Kopfschmerzen speichern Ich ging durch.

Im Fall von .Net-Mitgliedschaftsanbieter , stellen Sie sicher, dass Sie die Einstellung in Ihrer web.config oder app.config haben. Sonst wird es automatisch seinen eigenen Schlüssel generiert ... Mist auf Authentifizierung, und dann am Ende bei Ihnen belligerently lachen.

Sie benötigen einen Schlüssel für HMACSHA256. Der Schlüssel wird zufällig sein, wenn es nicht in den Konstruktor übergeben wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top