hashlib vs crypt.crypt () en Python. Pourquoi des résultats différents?
Je suis en train d'apprendre le Python. Je ne peux pas comprendre pourquoi hashlib.sha512(salt + password).hexdigest()
ne donne pas les résultats escomptés.
Je suis à la recherche d'un pur Python de mise en œuvre de l'équivalent d'Ulrich Drepper de sha512crypt.c algorithme. (Il m'a fallu un certain temps pour comprendre ce que je cherchais.)
Selon la page de man pour crypt
sur mon Ubuntu 12.04 système, la crypte est l'aide de l'algorithme SHA-512 (parce que les chaînes de commencer avec $6$).
Le code ci-dessous vérifie que le comportement est comme prévu, quand je l'appelle Python wrapper du système de la crypte (c'est à dire, une crypte.crypt()). Je veux utiliser hashlib.sha512 ou une autre lib Python pour produire le même résultat que la crypte.crypt(). Comment?
Ce code montre le problème que je rencontre:
import hashlib, crypt
ctype = "6" #for sha512 (see man crypt)
salt = "qwerty"
insalt = '${}${}$'.format(ctype, salt)
password = "AMOROSO8282"
value1 = hashlib.sha512(salt + password).hexdigest() #what's wrong with this one?
value2 = crypt.crypt(password, insalt) #this one is correct on Ubuntu 12.04
if not value1 == value2:
print("{}\n{}\n\n".format(value1, value2))
Selon la crypte de la page de man, SHA-512 est de 86 caractères. Le crypt()
appel dans le code ci-dessus est conforme aux que. Cependant, la sortie de hashlib.sha512 est de plus de 86 caractères, si quelque chose est chemin entre ces deux implmentations...
Voici la sortie pour ceux qui ne veulent pas exécuter le code:
051f606027bd42c1aae0d71d049fdaedbcfd28bad056597b3f908d22f91cbe7b29fd0cdda4b26956397b044ed75d50c11d0c3331d3cb157eecd9481c4480e455
$6$qwerty$wZZxE91RvJb4ETR0svmCb69rVCevicDV1Fw.Y9Qyg9idcZUioEoYmOzAv23wyEiNoyMLuBLGXPSQbd5ETanmq/
Une autre tentative est basée sur les premiers commentaires ici. Sans succès encore:
import hashlib, crypt, base64
ctype = "6" #for sha512 (see man crypt)
salt = "qwerty"
insalt = '${}${}$'.format(ctype, salt)
password = "AMOROSO8282"
value1 = base64.b64encode(hashlib.sha512(salt + password).digest())
value2 = crypt.crypt(password, insalt) #this one is correct
if not value1 == value2:
print("{}\n{}\n\n".format(value1, value2))
source d'informationauteur MountainX
Vous devez vous connecter pour publier un commentaire.
Voici la solution. Il est également plus en détail à cette autre question: Python de mise en œuvre de sha512_crypt.c où il montre que le backend de passlib contient un pur Python de mise en œuvre de sha512_crypt (et le Python de la mise en œuvre est appelée que si la crypte.crypt() n'est pas disponible sur le système d'exploitation).
$ sudo pip install passlib
Voici le résultat:
Un point clé est que Passlib dispose d'un pur Python de mise en œuvre de sha512_crypt qu'il va utiliser lorsque le système n'a pas la crypte de la mise en œuvre que la version actuelle de Linux systèmes (par exemple, http://www.akkadia.org/drepper/SHA-crypt.txt).
Voir le documentation pour PassLib ici:
passlib - hachage de mot de passe de la bibliothèque pour python - Google Project Hosting
https://code.google.com/p/passlib/
Passlib 1.6.2 documentation — Passlib v1.6.2 Documentation
http://pythonhosted.org/passlib/
passlib-utilisateurs - Google Groupes
https://groups.google.com/forum/#!forum/passlib-utilisateurs
Nouvelle Application Guide de Démarrage rapide — Passlib v1.6.2 Documentation
http://pythonhosted.org/passlib/new_app_quickstart.html#sha512-crypt
passlib.de hachage.sha512_crypt - SHA-512 Crypte — Passlib v1.6.2 Documentation
http://pythonhosted.org/passlib/lib/passlib.hash.sha512_crypt.html#passlib.hash.sha512_crypt
Le manuel de
crypt
est imprécise (même induire en erreur). Les algorithmes utilisés parcrypt
avec la “MD5”, “SHA-256” ou “SHA-512” monikers sont en fait des algorithmes de construit sur ces primitives. Ils sont mot de passe fonction de dérivation de cléà l'aide de la table de hachage pour effectuer la clé du renforcement de.Un bon algorithme de hachage de mot de passe a deux propriétés: il faut combiner le mot de passe avec un unique sel (pour vaincre les tentatives de fissure de nombreux mots de passe à la fois), et il doit être lent (parce que ça fait mal à l'attaquant de plus que le défenseur, puisque l'attaquant a besoin d'essayer un grand nombre de combinaisons). Tous les jours algorithmes de hachage comme MD5 et SHA familles sont conçus pour être rapide, aussi rapide que possible, tout en ayant encore le niveau de sécurité désiré propriétés. Une façon de construire un algorithme de hachage de mot de passe est de prendre un algorithme de hachage cryptographique et de la répéter plusieurs fois. Tout ce n'est pas l'idéal (parce qu'il y a de meilleures techniques qui font qu'il est plus difficile de créer du matériel dédié pour le craquage de mot de passe), elle est suffisante.
La Article de Wikipedia pour
crypt(3)
fournit une brève explication et a des pointeurs vers des sources primaires. Linux et FreeBSD pages de man sont pauvres, mais La version de Solaris a suffisamment d'informations pour ne pas être trompeuse (suivez les liens pourcrypte.conf(4)
et puiscrypt_sha512
et les autres). Vous pouvez également lire les Est mot de passe utilisateur dans ubuntu 13.04 en texte brut? et Est-il de la répétition dans le Solaris 11 hachage routine? Puis-je ajouter?Le droit de calculer la sortie de
crypt
en Python est d'appelercrypt.crypt
.Vos mots de passe ne sont pas de la même longueur, c'est parce que la
crypt()
la sortie est encodé en base64 et que vous utilisez hexdigest pour
value1
.Au lieu de hexdigest, vous devriez essayer de faire quelque chose comme
avec
crypt_base64
comme le bash mise en œuvrela dernière partie dedoHash()
fonction.