wollte einfach diesen Beitrag teilen:
http://forums.asp.net/t/1842429.aspx?System+Web+Helpers+Crypto+HashPassword
Hallo,
Ich habe in System.Web.Helpers am neuen Crypto HashPassword und VerifyMethod Methode suchen.
Beide Methoden verwenden ein Salz, aber sie geben das Salz nicht nur den Hash zurück.
Benötige ich das Salz nicht, um es in der Datenbank zu speichern? Fehle ich etwas?
Danke,
Miguel
..
Sie das Salz erzeugen würde, wenn der Benutzer das Konto erstellt, und dann Sie es an das Passwort anhängen würde, bevor Sie HashPassword nennen . Sie würden dann speichern Sie das Salz und das Hash-Passwort in Ihrer Datenbank. Wenn Sie die Anmeldeinformationen validieren, lesen Sie einfach das Salz aus der Datenbank und hängen es an das Kennwort von der Anmeldung vor dem Aufruf von VerifyHashedPassword. BrockAllen
..
nicht sicher, ob ich es verstanden ... Weil in HashPassword ein Salz ist innerhalb der Methode erzeugt:
Miguel
// Method in Crypto class
public static string HashPassword(string password)
{
if (password == null)
{
throw new ArgumentNullException("password");
}
// Produce a version 0 (see comment above) password hash.
byte[] salt;
byte[] subkey;
using (var deriveBytes = new Rfc2898DeriveBytes(password, SaltSize, PBKDF2IterCount))
{
salt = deriveBytes.Salt;
subkey = deriveBytes.GetBytes(PBKDF2SubkeyLength);
}
byte[] outputBytes = new byte[1 + SaltSize + PBKDF2SubkeyLength];
Buffer.BlockCopy(salt, 0, outputBytes, 1, SaltSize);
Buffer.BlockCopy(subkey, 0, outputBytes, 1 + SaltSize, PBKDF2SubkeyLength);
return Convert.ToBase64String(outputBytes);
}
..
BrockAllen 11. September 2012 19.50
Ja, ignorieren, dass - es ist ein inneres Salz für die Rfc2898DeriveBytes und es aus dem Passwort abgeleitet ist, so dass es kein echtes Salz ist in der Kontext der Speicherung von Passwörtern, da es für das gleiche Passwort konsequent neu erstellt wird. Sie werden immer noch Ihr eigenes Salz unter der Passwort-Zeichenkette machen wollen. So etwas wie folgt aus:
public void CreateAccount(string username, string password)
{
var salt = Crypto.GenerateSalt();
var saltedPassword = password + salt;
var hashedPassword = Crypto.HashPassword(saltedPassword);
CreateAccount(username, salt, hashedPassword);
}
public void Verify(string username, string password)
{
var salt = GetSaltForUserFromDatabase(username);
var hashedPassword = GetHashedPasswordForUserFromDatabase(username);
var saltedPassword = password + salt;
if (Crypto.VerifyHashedPassword(hashedPassword, saltedPassword))
{
// valid password for this username
}
}
Dies ermöglicht Ihnen, Ihr Salz in der Datenbank zu speichern zusammen mit dem gesalzenen Passwort gehasht.
Zusätzliche Informationen über Passwort-Hashing mit Salz im allgemeinen von diesem Posten: https://crackstation.net/hashing-security.htm
Um ein Passwort zu speichern
- Generieren eines langen Zufalls Salz ein CSPRNG verwenden.
- Fügen Sie das Salz dem Kennwort voran und hashen Sie es mit einer standardmäßigen kryptographischen Hash-Funktion wie SHA256.
- Speichern Sie das Salz und den Hash im Datenbankeintrag des Benutzers.
Um ein Passwort
- das Salz des Benutzers abrufen und Hash aus der Datenbank zu validieren.
- Das Salz auf das angegebene Passwort vorgeben und mit der gleichen Hash-Funktion hashen.
- Vergleichen Sie den Hash des angegebenen Kennworts mit dem Hash aus der Datenbank. Wenn sie übereinstimmen, ist das Passwort korrekt. Ansonsten ist das Passwort falsch.
Source Code für Crypto Klasse:
http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Helpers/Crypto.cs
+1 aber wo ist die Blog-Post –
Ich kann nicht vorstellen, wie es ein Salz erzeugt, aber Sie speichern nicht in der Datenbank für die nächste Überprüfung ? –
@LeandroDeMelloFagundes Das Salz und das Hash-Passwort sind beide in der einzigen Zeichenfolge gespeichert, die von 'Crypto.HashPassword' zurückgegeben wird. –