Existe-t-il une norme pour utiliser PBKDF2 comme hachage de mot de passe?

Rejoignez-moi dans la lutte contre la faiblesse des mots de passe.

un hash mot de passe PBKDF2 doit contenir le sel, le nombre d'itérations, et le hash lui-même pour qu'il soit possible de le vérifier plus tard. Existe-t-il un format standard, comme le {SSHA} de RFC2307, pour les hachages de mot de passe PBKDF2? BCRYPT est génial mais PBKDF2 est plus facile à implémenter.

apparemment, il n'y a pas de spécifications. Voici ma spécification.

>>> from base64 import urlsafe_b64encode
>>> password = u"hashy the N{SNOWMAN}"
>>> salt = urlsafe_b64decode('s8MHhEQ78sM=')
>>> encoded = pbkdf2_hash(password, salt=salt)
>>> encoded
'{PBKDF2}1000$s8MHhEQ78sM=$hcKhCiW13OVhmLrbagdY-RwJvkA='

mise à Jour: http://www.dlitz.net/software/python-pbkdf2/ définit un crypt() remplacement. J'ai mis à jour ma petite spécification pour qu'elle corresponde à la sienne, sauf qu'elle commence par $p5k2$ au lieu de {PBKDF2}. (J'ai besoin de migrer loin des autres modèles LDAP {}).

C'est {PBKDF2}, le nombre d'itérations en minuscules hexadécimal, $, le urlsafe_base64 codé sel, $ et urlsafe_base64 codé PBKDF2 de sortie. Le sel doit être 64 bits, le nombre d'itérations doit être à moins de 1000, et le PBKDF2 avec HMAC-SHA1 sortie peut être n'importe quelle longueur. Dans mon implémentation, il est toujours de 20 octets (la longueur D'un hachage SHA-1) par défaut.

le mot de passe doit être encodé en utf-8 avant d'être envoyé par PBKDF2. Aucun mot sur le fait de savoir si elle devrait être normalisée dans le NFC D'Unicode.

Ce système devrait être de l'ordre de iterations fois plus coûteux à la force brute que {SSHA}.

12
demandé sur joeforker 2009-09-24 22:19:36

2 réponses

il y a une spécification pour le paramètres (sel et itérations) de PBKDF2, mais il n'inclut pas le hachage. Ce qui est inclus dans PKCS #5 version 2.0 (voir Annexe A. 2). Certaines plateformes prennent en charge l'encodage et le décodage de cette ASN.1 structure.

depuis PBKDF2 est vraiment une fonction de dérivation de clé, il n'a pas de sens pour lui de spécifier une façon de regrouper le "hachage" (qui est le vraiment une clé dérivée) avec la dérivation paramètres-dans l'usage normal, la clé doit rester secrète et n'est jamais stockée.

mais pour une utilisation comme hachage de mot de passe à Sens Unique, le hachage peut être stocké dans un enregistrement avec les paramètres, mais dans son propre champ.

4
répondu erickson 2009-09-24 18:34:21

je me joindrai à vous dans la lutte contre les coups faibles.

OWASP a une feuille de triche de stockage de mot de passe (https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet) avec quelques conseils; ils recommandent 64,000 itérations PBKDF2 minimum à partir de 2012, doublant tous les deux ans (c.-à-d. 90,510 en 2012).

notez qu'un stockage d'un sel long, cryptographiquement aléatoire par utilisateur est toujours basique.

Notez que le fait d'avoir un très variable par userid nombre de les itérations et le stockage du nombre d'itérations avec le sel ajouteront une certaine complexité au logiciel de fissuration, et peuvent aider à empêcher certaines optimisations. Par exemple," bob "est chiffré avec 135817 itérations, tandis que" alice " utilise 95 121 itérations, soit peut-être un minimum de(90510 + RAND(90510)) pour 2013.

Notez aussi que tout cela est inutile si les utilisateurs sont autorisés à choisir des mots de passe faibles comme "password", "Password1!"", P@$$w0rd", et "P@$$w0rd123", qui seront tous trouvé par des attaques de dictionnaire basées sur des règles très rapidement en effet (ce dernier est simplement "mot de passe" avec les règles suivantes: majuscule première lettre, 1337-parler, ajouter un nombre de trois chiffres à la fin). Prenez une liste de base de dictionnaires (phpbb, pour une bonne, petite liste de mots de départ) et appliquez des règles comme celle-ci à elle, et vous Crac un grand nombre de mots de passe où les gens essaient des trucs "intelligents".

par conséquent, lors de la vérification des nouveaux mots de passe, ne vous contentez pas d'appliquer "les quatre en haut, en bas, nombre, chiffre, au moins 11 caractères long", puisque "P@$ $ w0rd123" respecte cette règle apparemment très dure. Au lieu de cela, utilisez cette liste de dictionnaire de base et voir si les règles de base le Crac (c'est beaucoup plus simple que d'essayer réellement une fissure - vous pouvez caser votre liste et leur mot, puis simplement écrire le code comme "si les 4 derniers caractères sont une année commune, cochez tous sauf les quatre derniers caractères contre la liste de mots", et "si les 3 derniers caractères sont des chiffres, cochez tous sauf les 3 derniers caractères contre le liste de mots" et "vérifier tous, mais les deux derniers caractères à l'encontre de la liste des mots" et "De-1337 le mot de passe de tourner un '@ ' dans un, 3 dans e, et ainsi de suite, puis de la comparer à la liste des mots et essayez ces autres règles."

en ce qui concerne les mots de passe, en général sont une bonne idée, surtout si d'autres caractères sont ajoutés au milieu des mots, mais si et seulement si elles sont assez longues, puisque vous renoncez à beaucoup de combinaisons possibles.

Notez que les machines modernes Les GPU sont jusqu'à des dizaines de milliards d'itérations de hachage (MD5, SHA1, SHA-256, SHA-512, etc. par seconde, même en 2012. En ce qui concerne la combinaison de mots "correct Horse battery staple" Type mots de passe, celui - ci est au mieux un mot de passe très modeste-il est seulement 4 tous les mots anglais minuscules de longueur 7 ou moins avec des espaces. Donc, si nous allons chercher des mots de passe de style XKCD avec un 18 milliards de deviner une deuxième configuration: un petit dictionnaire d'anglais américain moderne a: 6k Mots de longueur 5 ou moins 21k mots de longueur 7 ou moins 36k mots de longueur 9 ou moins 46k mots de longueur 11 ou moins 49k mots de longueur 13 ou moins

avec une phrase de passe de style XKCD, et sans prendre la peine de filtrer les mots par popularité ("correct "vs." chair's "vs." dumpier "vs." hemorrhaging") nous avons 21k^4, qui est seulement environ 2e17 possibilités. Avec la configuration de 18 milliards/sec (une seule machine avec 8 GPU si nous sommes confrontés à une itération SHA1 simple), c'est environ 4 mois pour rechercher exhaustivement l'espace de clé. Si nous avions dix des installations, ce qui représente environ deux semaines. Si nous excluons les mots invraisemblables comme "dumpier", c'est beaucoup plus rapide pour un premier passage rapide.

maintenant, si vous obtenez des mots d'une" énorme "liste de mots linux en anglais américain, comme "Balsamina" ou "Calvinistically" (les deux choisis en utilisant la fonctionnalité "go to row"), alors nous aurions 30k mots de longueur 5 ou moins 115k mots de longueur 7 ou moins 231k mots de longueur 9 ou moins 317k mots de longueur 11 ou moins 362k mots de longueur 13 ou moins

même avec le 7 length max limit, avec cet énorme dictionnaire comme base et des mots choisis au hasard, nous avons 115k^4 ~= 1.8E20 possibilités, ou environ 12 ans si la configuration est maintenue à jour (doublement en puissance tous les 18 mois). C'est extrêmement similaire à un 13 caractère, minuscule + nombre mot de passe seulement. "300 ans" est ce que la plupart des estimations vous diront, mais ils ne tiennent pas compte de la Loi de Moore.

4
répondu Anti-weakpasswords 2013-03-27 02:19:10