gpt4 book ai didi

python - hashlib 与 Python 中的 crypt.crypt() 对比。为什么会有不同的结果?

转载 作者:太空狗 更新时间:2023-10-29 19:33:42 55 4
gpt4 key购买 nike

我正在学习 Python。我不明白为什么 hashlib.sha512(salt + password).hexdigest() 没有给出预期的结果。

我正在寻找与 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))

根据 crypt 手册页,SHA-512 是 86 个字符。上面代码中的 crypt() 调用符合这一点。但是,hashlib.sha512 的输出超过 86 个字符,因此这两个实现之间存在一定差距...

对于那些不想运行代码的人来说,这是输出:

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))

最佳答案

这是解决方案。其他问题也有更多详细信息:Python implementation of sha512_crypt.c其中显示 passlib 的后端包含 sha512_crypt 的纯 Python 实现(如果 crypt.crypt() 在操作系统上不可用,则调用 Python 实现)。

$ sudo pip install passlib

import passlib.hash, crypt

ctype = "6" #for sha512 (see man crypt)
salt = "qwerty"
insalt = '${}${}$'.format(ctype, salt)
password = "AMOROSO8282"

value1 = sha512_crypt.encrypt(password, salt=salt, rounds=5000)
value2 = crypt.crypt(password, insalt)
if not value1 == value2:
print("algorithms do not match")
print("{}\n{}\n\n".format(value1, value2))

这是输出:

$6$qwerty$wZZxE91RvJb4ETR0svmCb69rVCevicDV1Fw.Y9Qyg9idcZUioEoYmOzAv23wyEiNoyMLuBLGXPSQbd5ETanmq/
$6$qwerty$wZZxE91RvJb4ETR0svmCb69rVCevicDV1Fw.Y9Qyg9idcZUioEoYmOzAv23wyEiNoyMLuBLGXPSQbd5ETanmq/

一个关键点是 Passlib 有一个 sha512_crypt 的纯 Python 实现,当系统没有当前 Linux 系统拥有的 crypt 实现(例如,http://www.akkadia.org/drepper/SHA-crypt.txt)时,它将使用它。

请在此处查看PassLib 文档:

passlib - python 的密码哈希库 - Google 项目托管
https://code.google.com/p/passlib/

Passlib 1.6.2 文档 — Passlib v1.6.2 文档
http://pythonhosted.org/passlib/

passlib-users - Google 网上论坛
https://groups.google.com/forum/#!forum/passlib-users

新应用快速入门指南——Passlib v1.6.2 文档
http://pythonhosted.org/passlib/new_app_quickstart.html#sha512-crypt

passlib.hash.sha512_crypt - SHA-512 密码 — Passlib v1.6.2 文档
http://pythonhosted.org/passlib/lib/passlib.hash.sha512_crypt.html#passlib.hash.sha512_crypt

关于python - hashlib 与 Python 中的 crypt.crypt() 对比。为什么会有不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21090312/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com