44 votes

Hachage de mots de passe avec MD5 ou sha-256 C #

J'écris un formulaire de registre pour une application, mais j'ai toujours des problèmes pour être nouveau dans c #.

Je cherche à chiffrer / hacher les mots de passe à md5 ou sha-256, de préférence sha-256.

Des bons exemples? Je veux qu'il soit capable de prendre les informations de "mot de passe de chaîne;" puis hachez-le et stockez-le dans la variable "chaîne hPassword;". Des idées?

79voto

LukeH Points 110965

Ne pas utiliser un simple hash, ou même un salée de hachage. Utiliser une sorte de touche-le renforcement de la technique comme bcrypt (avec une .NET mise en œuvre ici) ou PBKDF2 (avec un construit-dans la mise en œuvre).

Voici un exemple d'utilisation de PBKDF2.

Pour générer une clé de votre mot de passe...

string password = GetPasswordFromUserInput();

// specify that we want to randomly generate a 20-byte salt
using (var deriveBytes = new Rfc2898DeriveBytes(password, 20))
{
    byte[] salt = deriveBytes.Salt;
    byte[] key = deriveBytes.GetBytes(20);  // derive a 20-byte key

    // save salt and key to database
}

Et puis pour tester si un mot de passe est valide...

string password = GetPasswordFromUserInput();

byte[] salt, key;
// load salt and key from database

using (var deriveBytes = new Rfc2898DeriveBytes(password, salt))
{
    byte[] newKey = deriveBytes.GetBytes(20);  // derive a 20-byte key

    if (!newKey.SequenceEqual(key))
        throw new InvalidOperationException("Password is invalid!");
}

55voto

Donut Points 32892

Vous allez avoir à utiliser l' System.Security.Cryptography de l'espace de noms; en particulier, l' MD5 de la classe ou de l' SHA256 classe.

Dessin un peu le code sur cette page, et avec la connaissance que les deux classes ont la même classe de base (HashAlgorithm), vous pouvez utiliser une fonction comme ceci:

public string ComputeHash(string input, HashAlgorithm algorithm)
{
   Byte[] inputBytes = Encoding.UTF8.GetBytes(input);

   Byte[] hashedBytes = algorithm.ComputeHash(inputBytes);

   return BitConverter.ToString(hashedBytes);
}

Ensuite, vous pouvez l'appeler comme cela (MD5):

string hPassword = ComputeHash(password, new MD5CryptoServiceProvider());

Ou pour SHA256:

string hPassword = ComputeHash(password, new SHA256CryptoServiceProvider());

Edit: Ajout De Sel De Soutien
Comme dtb souligné dans les commentaires, ce code serait plus forte si elle comprenait la possibilité d'ajouter du sel. Si vous n'êtes pas familier avec elle, le sel est un ensemble de bits aléatoires, qui sont inclus en tant que contribution à la fonction de hachage, qui va un long chemin pour contrecarrer les attaques de dictionnaire à l'encontre d'un hachage de mot de passe (par exemple, à l'aide d'un arc-en-ciel de la table). Voici une version modifiée de l' ComputeHash fonction qui prend en charge le sel:

public static string ComputeHash(string input, HashAlgorithm algorithm, Byte[] salt)
{
   Byte[] inputBytes = Encoding.UTF8.GetBytes(input);

   // Combine salt and input bytes
   Byte[] saltedInput = new Byte[salt.Length + inputBytes.Length];
   salt.CopyTo(saltedInput, 0);
   inputBytes.CopyTo(saltedInput, salt.Length);

   Byte[] hashedBytes = algorithm.ComputeHash(saltedInput);

   return BitConverter.ToString(hashedBytes);
}

Espérons que cela a été utile!

6voto

Adam Spicer Points 1830

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);
}

2voto

adrift Points 24386

Si vous allez stocker les mots de passe hachés, l'utilisation bcrypt au lieu de l'algorithme SHA-256. Le problème est que SHA-256 est optimisé pour la vitesse, ce qui rend plus facile pour une attaque en force brute sur les mots de passe doivent quelqu'un d'accéder à votre base de données.

Lire cet article: Assez Avec Les Tables arc-en-ciel: Ce que Vous Devez Savoir à Propos de Mot de passe Sécurisé Régimes et cette réponse à une précédente DONC, la question.

Quelques citations de l'article:

Le problème est que MD5 est rapide. Ses moderne concurrents, comme SHA1 et SHA256. La vitesse est un des objectifs de la conception moderne de hachage sécurisé, parce que les hachages sont un bloc de construction de presque tous les crypto-système, et généralement obtenir à la demande exécuté par paquet ou par message de base.

La vitesse est exactement ce que vous ne voulez pas dans un mot de passe fonction de hachage.


Enfin, nous avons appris que si nous voulons stocker les mots de passe en toute sécurité, nous avons trois options raisonnables: PHK du MD5 régime, Provos-Maziere de Bcrypt régime, et PRS. Nous avons appris que le bon choix est Bcrypt.

2voto

thashiznets Points 61

PBKDF2 utilise HMACSHA1 ....... si vous voulez une implémentation plus moderne de HMACSHA256 ou HMACSHA512 et que vous voulez toujours que la clé s'étire pour ralentir l'algorithme, je suggère cette API: https://sourceforge.net/projects/pwdtknet/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X