我正在学习Python。我无法弄清楚为什么hashlib.sha512(salt + password).hexdigest()
没有给出预期的结果。hashlib vs crypt.crypt()在Python中。为什么不同的结果
我正在寻找相当于Ulrich Drepper的sha512crypt.c algorithm的纯Python实现。 (我花了一段时间才弄清楚我在找什么。)
根据Ubuntu 12.04系统上crypt
的手册页,crypt使用SHA-512(因为字符串以$ 6 $开头)。
下面的代码验证当我调用Python的系统crypt(即crypt.crypt())的包装时,行为与预期的一样。我想使用hashlib.sha512或其他一些Python库来产生与crypt.crypt()相同的结果。怎么样?
这段代码演示了我遇到的问题:
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))
根据隐窝手册页,SHA-512是86个字符。上面的代码中的crypt()
调用符合此。然而,hashlib.sha512的输出超过86个字符长,所以事情是这两个implmentations之间的路要走......
下面是对于那些不想运行的代码谁输出:
051f606027bd42c1aae0d71d049fdaedbcfd28bad056597b3f908d22f91cbe7b29fd0cdda4b26956397b044ed75d50c11d0c3331d3cb157eecd9481c4480e455
$6$qwerty$wZZxE91RvJb4ETR0svmCb69rVCevicDV1Fw.Y9Qyg9idcZUioEoYmOzAv23wyEiNoyMLuBLGXPSQbd5ETanmq/
这里基于初始反馈的另一个尝试。没有成功尚未:
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))
是您的密码(不包括数字)故意用葡萄牙语表示的还是一个尴尬的巧合?只是好奇':)' – JMCF125
这个密码是一个真正的密码,从真正的被盗密码fwiw的大型数据库中提取。 – MountainX
我明白了。如果没有盐,用葡萄牙语小字典制作的彩虹桌确实很容易破解。顺便说一句,+1,这是一个有趣的问题,即使我不使用Python。 – JMCF125