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