Comment utiliser scrypt pour générer le hachage de mot de passe et le sel dans Python
Je voudrais utiliser scrypt pour créer un hachage pour mes utilisateurs, mots de passe et les sels. J'ai trouvé deux références, mais il y a des choses que je ne comprends pas à leur sujet.
Ils utilisent le scrypt de chiffrer et de déchiffrer des fonctions. On chiffre une chaîne de caractères aléatoires et l'autre chiffre le sel (ce qui est faux puisque seul le mot de passe et de ne pas le sel est utilisé pour le décryptage). Il ressemble à la déchiffrer fonction est utilisée pour valider le mot de passe/le sel comme un effet secondaire du décryptage.
Basé sur le peu que j'en comprends, ce que je veux, c'est une fonction de dérivation de clé (KDF) plutôt que de chiffrement/déchiffrement et que le KDF est probablement générées et utilisées par scrypt pour le chiffrement/déchiffrement. La réelle KDF est utilisée dans les coulisses et je crains que aveuglément à la suite de ces exemples conduira à une erreur. Si le scrypt chiffrer/déchiffrer les fonctions sont utilisées pour générer et vérifier le mot de passe, je ne comprends pas le rôle de la chaîne cryptée. Son contenu ou de la longueur de la matière?
OriginalL'auteur Mitch | 2012-11-30
Vous devez vous connecter pour publier un commentaire.
Vous êtes correct - le scrypt les fonctions de ces deux liens sont de jouer avec le scrypt fichier de l'utilitaire de chiffrement, de ne pas le sous-jacent kdf. J'ai été en train de travailler sur la création d'un autonome scrypt à base de hachage de mot de passe pour python, et a couru dans cette question de moi-même.
Le scrypt utilitaire de fichier est le suivant: détermine scrypt du n/r/p des paramètres spécifiques à votre système & le "temps min" paramètre. Il génère ensuite une de 32 octets de sel, et puis les appels
scrypt(n,r,p,salt,pwd)
pour créer un 64 octets de la clé. La chaîne binaire de l'outil renvoie est composé de: 1) un en-tête contenant du n, r, les valeurs de p, et le sel codé en binaire; 2) une somme de contrôle sha256 de l'en-tête; et 3) un hmac-sha256 copie signée de la somme de contrôle, en utilisant les 32 premiers octets de la clé. Par la suite, il utilise les autres 32 octets de la clé AES de chiffrer les données d'entrée.Il y a quelques implications de ce que je peux voir:
les données d'entrée est vide de sens, puisqu'il n'en est pas réellement une incidence sur le sel utilisé, et encrypt() génère un nouveau sel à chaque fois.
vous ne pouvez pas configurer le n,r,p de la charge de travail manuellement, ou de toute autre façon mais la maladroite min-temps de chauffe. ce n'est pas l'insécurité, mais est plutôt une façon maladroite pour contrôler le travail du facteur.
après le déchiffrer appel régénère la clé et la compare le hmac, il rejettera tout droit de là-bas si votre mot de passe est faux - mais si c'est bon, ça va passer à la aussi décrypter l'ensemble des données. C'est beaucoup de travail supplémentaire, l'attaquant n'aurez pas à effectuer - ils n'ont même pas de dériver de 64 octets, seulement 32 pour vérifier la signature. Cette question n'a pas de insécurité exactement, mais en le faisant travailler votre attaquant n'est jamais souhaitable.
il n'y a aucun moyen de configurer le sel de clé, clé dérivée de la taille, etc. les valeurs actuelles ne sont pas mauvais en soit, mais encore, ce n'est pas idéal.
le déchiffrer utilitaire "max de temps" limitation est mauvais pour le hachage de mot de passe chaque fois que décrypter l'appelle, il les estimations de la vitesse de votre système, et un peu de "deviner" quant à savoir si il est possible de calculer la clé dans un délai max de temps qui est plus frais généraux de votre agresseur n'a pas à faire (voir #3), mais c'est aussi décrypter pourrait commencer à rejeter les mots de passe sous la lourde charge du système.
Je ne suis pas sûr pourquoi Colin Percival n'a pas fait le kdf & paramètre de choix de la partie code de l'api publique, mais c'est en fait explicitement mention "privé" à l'intérieur du code source, même pas exporté pour la liaison. Ce qui me fait hésiter à juste y accéder directement, sans beaucoup plus d'étude.
Dans l'ensemble, ce qui est nécessaire est une belle hachage format qui permet de stocker les scrypt, et une mise en œuvre qui expose le sous-jacent kdf et le paramètre-le choix de l'algorithme. Je suis actuellement en train de travailler sur moi-même pour passlib, mais il n'a pas vu beaucoup d'attention 🙁
Juste à la ligne de fond des choses bien ces instructions du site sont "ok", je voudrais utiliser une chaîne vide comme le contenu du fichier, et être conscient de la surcharge et de questions.
OriginalL'auteur Eli Collins
Ces deux références eu tout à fait tort. Ne pas muck avec
encrypt
etdecrypt
: il suffit d'utiliserhash
La KDF n'est pas exposé directement, mais
hash
est assez proche. (En fait, il me semble, pour être encore meilleur, car il mélange le remplissage d'un PBKDF2 sandwich.)Cet exemple de code fonctionne à la fois avec python2.7 et python3.2. Il utilise PyCrypto, passlib, et py-scrypt, mais seulement besoins py-scrypt.
Vous souhaitez utiliser un contstant-comparaison du temps de fonction comme
passlib.utils.consteq
à atténuer les attaques temporelles.Vous voudrez aussi de choisir les paramètres soigneusement. Les valeurs par défaut logN=14,r=8,p=1 signifie 1 "rond" à l'aide de 16 mo de mémoire. Sur un serveur, vous voulez probablement quelque chose de plus comme 10,8,8 -- moins de RAM, plus de CPU. Vous devez le temps sur votre du matériel sous votre charge prévue.
OriginalL'auteur Terrel Shumway