web-dev-qa-db-fra.com

Pré-hachage du mot de passe avant d'appliquer bcrypt pour éviter de restreindre la longueur du mot de passe

La bonne pratique est de ne pas restreindre inutilement la longueur des mots de passe, de sorte que des phrases de passe suffisamment longues (peut-être 35 à 45 caractères pour 6/7 mots de dés) puissent être utilisées. (Voir par exemple Dois-je avoir une longueur de mot de passe maximale? où un maximum de 1K est suggéré, pour se protéger contre le DoS sans restreindre la capacité des utilisateurs à définir des mots de passe longs.)

bcrypt est également couramment recommandé (voir par exemple Des experts en sécurité recommandent-ils bcrypt pour le stockage des mots de passe? , http://chargen.matasano.com/chargen/2007/9/7/enough- with-the-Rainbow-tables-what-you-need-to-know-about-s.html )

Il est également recommandé d'utiliser un sel (aléatoire et stocké avec le hachage de mot de passe) - je crois que 32 bits (4 caractères) est souvent recommandé. (Je comprends que la justification de la taille du sel est "suffisante pour que le nombre de combinaisons soit beaucoup plus grand que le nombre d'enregistrements utilisateur ET soit suffisant pour rendre les tables Rainbow infaisablement grandes" - 16 bits sont suffisants pour la deuxième partie mais peuvent ne pas l'être assez pour le premier.)

Mais AIUI bcrypt ne hache que 55 octets - avec 4 caractères pour le sel qui laisse 51 pour le mot de passe.

Je suppose que nous ne devrions pas simplement bcrypt (gauche (mot de passe, 51)) et ignorer les derniers caractères.

Faut-il simplement limiter les utilisateurs à 50 caractères dans leur mot de passe (assez pour presque tout le monde, mais pas définitivement assez)?

Faut-il utiliser quelque chose comme bcrypt (sha256 (sel + mot de passe)) à la place, et autoriser jusqu'à 1 000 caractères? Ou est-ce que l'ajout de l'étape sha256 (ou sha512?) Réduit en quelque sorte la sécurité globale?

Scrypt ou PBKDF2 ont-ils des restrictions de longueur similaires?

(La dernière question est juste pour l'intérêt, vraiment - je me rends compte que la dureté de l'espace/résistance FPGA, et la nouveauté relative de scrypt, et la résistance GPGPU de bcrypt par rapport à PBKDF2 sont des considérations beaucoup plus importantes pour décider quel hachage utilisation.)

65
Misha

L'utilisation d'une fonction de hachage sécurisée pour prétraiter le mot de passe est sécurisée; il peut être démontré que si bcrypt (SHA-256 (mot de passe)) est cassé, alors soit le mot de passe a été deviné, soit une caractéristique de sécurité de SHA-256 s'est avérée fausse. Il n'est pas nécessaire de jouer avec le sel à ce niveau; hachez simplement le mot de passe, puis utilisez bcrypt sur le résultat (avec le sel, comme mandats bcrypt). SHA-256 est considéré comme une fonction de hachage sécurisée.

Le point d'un sel doit être unique - aussi unique que possible, afin qu'aucun mot de passe haché n'utilise la même valeur de sel. 32 bits sont un peu faibles pour cela; vous devez utiliser un sel plus long. Si vous avez n bits de sel, vous rencontrerez des collisions (deux mots de passe hachés utilisant le même sel) dès que vous en aurez plus d'environ 2n/2 mots de passe hachés - c'est environ 65000 avec n = 32, une valeur pas trop élevée. Vous feriez mieux d'utiliser 64 bits ou plus de sel (utilisez 128 bits et vous pouvez cesser de vous en soucier).

39
Thomas Pornin

Bcrypt utilise un sel de 128 bits ET un mot de passe de 55 caractères (max). Vous n'avez pas besoin d'ajouter d'autres valeurs de sel; bcrypt gère cela.

Les concepteurs de bcrypt ont estimé que la limite de 55 caractères sur le mot de passe n'était pas un problème car le hachage a une sortie de 128 bits. Si votre mot de passe est supérieur à 55 caractères, les concepteurs ont supposé que vous fournissiez déjà plus de 128 bits d'entropie, ce n'est donc pas un problème. Au contraire, les directives du NIST compteraient cela comme seulement 77 bits d'entropie. Les directives du NIST sont basées sur le fait que les phrases de passe ont moins d'entropie par caractère que les mots de passe aléatoires et sur l'hypothèse que les utilisateurs utiliseront des phrases de passe pour des mots de passe plus longs. Pour mieux vous assurer d'obtenir une entropie complète de 128 bits, vous pouvez autoriser des mots de passe plus longs et les hacher en utilisant SHA-256 ou SHA-384 pour les compresser à une longueur acceptable. Vous pouvez également simplement simplifier les choses en utilisant scrypt ou PBKDF2 qui n'ont pas de limites de longueur. Scrypt est conçu pour être "dur en mémoire" en plus d'être long en termes de calcul; ce serait mon choix d'algorithmes.

14
Steven Alexander