Volevo solo condividere questo post:
http://forums.asp.net/t/1842429.aspx?System+Web+Helpers+Crypto+HashPassword
Ciao,
Sono stato a guardare il nuovo metodo Crypto HashPassword e VerifyMethod in System.Web.Helpers.
Entrambi i metodi usano un sale ma non restituiscono il sale solo l'hash.
Non ho bisogno del sale per memorizzarlo nel database? Mi sto perdendo qualcosa?
Grazie,
Miguel
..
Faresti generare il sale quando l'utente crea l'account, e poi si sarebbe aggiungerlo alla password prima di chiamare HashPassword . Avresti quindi memorizza quella salt e la password hash nel tuo DB. Quando si convalidano le credenziali , basta leggere il sale dal DB e aggiungerlo a la password dal login prima di chiamare VerifyHashedPassword. BrockAllen
..
Non sono sicuro se ho capito ... Perché in HashPassword un sale è generato all'interno del metodo:
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 Settembre 2012 19:50
Sì, ignorare che - è un sale interno per i Rfc2898DeriveBytes ed è derivata dalla password in modo che non è un vero e sale in il contesto di memorizzare le password poiché è costantemente ricreato per la stessa password. Si vorrà comunque eseguire il proprio sale con il livello di stringa password . Quindi, qualcosa di simile:
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
}
}
Questo vi permetterà di memorizzare il vostro sale nel database insieme alla password hash salata.
Ulteriori informazioni password hashing con sale, in generale, da questo post: https://crackstation.net/hashing-security.htm
per memorizzare una password
- Generare una lunga sale casuale usando un CSPRNG.
- Premere il tasto Salt sulla password e cancellarlo con una funzione di hash crittografica standard come SHA256.
- Salva sia il sale che l'hash nel record del database dell'utente.
per convalidare una password
- Recuperare sale dell'utente e hash dal database.
- Prependete il sale alla password specificata e cancellatelo usando la stessa funzione di hash.
- Confrontare l'hash della password fornita con l'hash dal database. Se corrispondono, la password è corretta. Altrimenti, la password non è corretta.
codice sorgente per la classe Crypto:
http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Helpers/Crypto.cs
+1 ma dov'è il post sul blog –
non riesco a immaginare come si crea un sale, ma non si memorizza nel database per la prossima verifica ? –
@LeandroDeMelloFagundes La password salt e Hashed sono entrambe memorizzate nella stringa singola restituita da 'Crypto.HashPassword' –