Sono nuovo di C# e questa è la mia prima domanda qui, quindi mi scuso in anticipo per qualsiasi passo falso.Convalida un hash salato
Contesto:
Quando un utente si registra chiamo il metodo CreateSaltedHash() e passano la password immessa utente dal campo di testo. Questo metodo salina e cancella la password prima di memorizzarla nella colonna Password della mia tabella Utente.
Domanda:
Come devo convalidare la password quando un utente tenta di accedere?
Se chiamo di nuovo il metodo CreateSaltedHash(), esso non corrisponderà a causa del sale casuale.
Devo conservare i sali in una colonna separata? Dovrei usare un delimitatore quando si genera l'hash salato? Qual è il modo più sicuro di convalidare la password di input con la password salata e con hash?
Codice: Questo è quello che ho finora.
public class PasswordHash
{
public const int SALT_BYTES = 32;
/*
* Method to create a salted hash
*/
public static byte[] CreateSaltedHash(string password)
{
RNGCryptoServiceProvider randromNumberGenerator = new RNGCryptoServiceProvider();
byte[] salt = new byte[SALT_BYTES];
randromNumberGenerator.GetBytes(salt);
HashAlgorithm hashAlgorithm = new SHA256Managed();
byte[] passwordByteArray = Encoding.UTF8.GetBytes(password);
byte[] passwordAndSalt = new byte[passwordByteArray.Length + SALT_BYTES];
for (int i = 0; i < passwordByteArray.Length; i++)
{
passwordAndSalt[i] = passwordByteArray[i];
}
for (int i = 0; i < salt.Length; i++)
{
passwordAndSalt[passwordByteArray.Length + i] = salt[i];
}
return hashAlgorithm.ComputeHash(passwordAndSalt);
}
public static bool OkPassword(string password)
{
//This is where I want to validate the password before logging in.
}
}
Chiamando il metodo nella classe Register.
User user= new User();
user.password = PasswordHash.CreateSaltedHash(TextBoxUserPassword.Text);
'Devo conservare i sali in una colonna separata? - Sì. Quindi fare riferimento a questo. – TheGeekZn
Capisci che c'è un problema serio con il tuo metodo di hashing giusto? Dovresti davvero usare un algoritmo hasing per proteggere le password, la tua scelta attuale non è una buona scelta. –
Ho modificato il tuo titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –