web-dev-qa-db-fra.com

Que faut-il utiliser comme sel?

J'entends toujours qu'il est préférable d'utiliser des sels sur les mots de passe stockés, qui sont ensuite concaténés et hachés par la suite. Mais je ne sais pas quoi à utiliser comme sel. Quel serait un bon sel?

43
Sal

Disons que vous avez une table où vous stockerez le mot de passe pour chaque personne.

Pour "enregistrer" le mot de passe généré, procédez comme suit

  1. obtenir la connexion de l'utilisateur
  2. obtenir le mot de passe
  3. générer du sel à partir de valeurs aléatoires. Disons que, depuis/dev/random (comme l'a suggéré @Michal), vous avez obtenu "a12bc34de56fg"
  4. Utilisez une fonction de hachage pour générer le mot de passe haché. Disons que le mot de passe d'origine était "1password" et vous utiliserez n'importe quel hachage SHA. Vous ferez

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg")))))))))

Enregistrez ce mot de passe haché, avec la connexion et le sel, dans le tableau.

login      password      salt
--------------------------------------
john       a7b82783...   a12bc34de56fg

Et puis, pour vérifier quand un utilisateur accède à votre application:

  1. obtenir le login et le mot de passe
  2. récupérer le sel de cette connexion dans la base de données (vous aurez le sel: a12bc34de56fg)
  3. concaténer le mot de passe en texte brut avec le sel et refaire tout le hachage:

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg")))))))))

Vérifiez si le mot de passe hashed que vous avez calculé est le même que celui stocké dans la base de données. Vous saurez si le mot de passe était correct ou non.

C'est ça!. Vous pouvez obtenir le sel de n'importe quelle source aléatoire que vous aimez. Pourquoi devrait-il être aléatoire? Parce que tout sel non aléatoire faciliterait beaucoup la tentative de force brute de votre application.

13
woliveirajr

La recommandation classique d'un sel pour le hachage de mot de passe est:

  • A valeur aléatoire de 128 bits ou plus ;
  • obtenu à partir d'un générateur de nombres aléatoires cryptographiquement solide ( /dev/random ou /dev/urandom sur les Unix modernes);
  • unique pour chaque entrée (c'est-à-dire ne pas réutiliser le même sel, générer un nouveau sel pour chaque nouveau mot de passe);
  • stocké en texte brut dans la base de données (afin que le sel soit disponible lors de la vérification du hachage).

Il y a beaucoup de discussions passées sur des sujets connexes . Et surtout, vous ne devez pas pas mettre en œuvre votre propre schéma de hachage de mot de passe - vous devez utiliser une mise en œuvre éprouvée, bien testée et évaluée par les pairs ( bcrypt/PBKDF2) .

30
Jesper M

La réponse est "presque n'importe quoi", bien que certains soient plus forts que d'autres.

Supposons que vous utilisez md5 (salt.password).

Sans sel, les pirates pirateront rapidement la plupart des mots de passe simplement en recherchant le hachage dans une table Rainbow.

Disons que vous utilisez "x" comme sel pour tous vos mots de passe. Beaucoup de vos mots de passe seront toujours trouvés, mais moins. En effet, si le mot de passe est "p4ssw0rd", il devient alors "xp4ssw0rd" avec le sel - ce qui le rend légèrement plus difficile, mais pas de manière significative.

Supposons maintenant que vous utilisez "% X88Fc + 7" comme sel unique pour tous vos mots de passe. À ce stade, les tables Rainbow ne fonctionneront pas. Mais, la conséquence de l'utilisation d'un sel pour tous les mots de passe, le pirate sera en mesure de générer une table Rainbow avec cette hypothèse et de construire des tables Rainbow à l'avance. C'est beaucoup plus sûr, mais pas parfait.

L'option suivante la plus sécurisée consiste à utiliser le nom d'utilisateur comme sel, en d'autres termes à l'aide de "md5 (username.password)". Encore une fois, cela bat la table Rainbow standard, mais un pirate peut générer une table Rainbow pour un nom d'utilisateur spécifique (comme "root" ou "administrateur"), de sorte que chaque fois que le mot de passe est modifié, le pirate peut faire une recherche dans un Rainbow table au lieu de la casser à nouveau.

Donc, pour être encore plus sûr, choisissez un sel aléatoire différent pour différents utilisateurs. Vous devez le stocker avec le hachage du nom d'utilisateur et du mot de passe. Cela bat complètement les tables Rainbow.

Certains suggèrent un générateur de nombres aléatoires "sécurisé", plutôt que quelque chose de simple. Par exemple, faire un MD5 (horodatage + nom d'utilisateur) lorsque l'utilisateur crée un compte est simple, mais pas cryptographiquement sécurisé (car les horodatages et les noms d'utilisateur sont prévisibles et donc à faible entropie). Mais, comme le pirate a quand même une copie du sel quand il vole la base de données, ce n'est pas un problème.

10

Pour le sel, utilisez simplement des bits aléatoires.

Sous Linux, vous pouvez utiliser /dev/random. C'est un générateur de nombres aléatoires du noyau basé sur le bruit ambiant. C'est assez imprévisible, sauf pour les machines virtuelles. Donc, si vous avez disons une souris physique branchée à votre boîte, alors /dev/random Vous donnera des bits aléatoires de haute qualité, bons pour le sel.

Voici un bon article pour commencer. Voir aussi les références externes.

Voici un exemple Java . Découvrez comment le sel est généré et stocké dans DB dans la fonction createUser(). Sauf pour l'utilisation de import Sun.misc. ... C'est un très bon code.

1
Michał Šrajer