Vous devriez toujours le sel le mot de passe avant de hachage lors de leur stockage dans la base de données.
Recommandé colonnes de base de données:
- PasswordSalt : int
- Propriétés passwordhash : binaire(20)
La plupart des postes que vous trouverez en ligne allons parler d'un codage ASCII, le sel et le hachage, mais qui n'est pas nécessaire et ne fait qu'ajouter inutiles calcul. Aussi, si vous utilisez l'algorithme SHA-1, alors la sortie sera seulement 20 octets de sorte que votre hash champ dans la base de données ne doit être de 20 octets de longueur. Je comprends votre demande sur SHA-256, mais à moins d'avoir une raison impérieuse, à l'aide de l'algorithme SHA-1 avec une valeur salt sera suffisant dans la plupart des pratiques commerciales. Si vous insistez sur SHA-256, puis le hachage champ dans la base de données doit être de 32 octets de longueur.
Voici quelques fonctions que va générer le sel, calculer la valeur de hachage et de vérifier le hachage contre un mot de passe.
Le sel de la fonction ci-dessous génère un fort niveau de chiffrement le sel comme un Entier de 4 cryptographique créé octets aléatoires.
private int GenerateSaltForPassword()
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] saltBytes = new byte[4];
rng.GetNonZeroBytes(saltBytes);
return (((int)saltBytes[0]) << 24) + (((int)saltBytes[1]) << 16) + (((int)saltBytes[2]) << 8) + ((int)saltBytes[3]);
}
Le mot de passe peut alors être hashé en utilisant le sel avec la fonction ci-dessous. Le sel est concaténé à la passe et puis le hash est calculé.
private byte[] ComputePasswordHash(string password, int salt)
{
byte[] saltBytes = new byte[4];
saltBytes[0] = (byte)(salt >> 24);
saltBytes[1] = (byte)(salt >> 16);
saltBytes[2] = (byte)(salt >> 8);
saltBytes[3] = (byte)(salt);
byte[] passwordBytes = UTF8Encoding.UTF8.GetBytes(password);
byte[] preHashed = new byte[saltBytes.Length + passwordBytes.Length];
System.Buffer.BlockCopy(passwordBytes, 0, preHashed, 0, passwordBytes.Length);
System.Buffer.BlockCopy(saltBytes, 0, preHashed, passwordBytes.Length, saltBytes.Length);
SHA1 sha1 = SHA1.Create();
return sha1.ComputeHash(preHashed);
}
Vérification du mot de passe peut être fait simplement par le calcul du hachage et de comparer ensuite les attendus de hachage.
private bool IsPasswordValid(string passwordToValidate, int salt, byte[] correctPasswordHash)
{
byte[] hashedPassword = ComputePasswordHash(passwordToValidate, salt);
return hashedPassword.SequenceEqual(correctPasswordHash);
}