检查 Moodle 的哈希密码

3
Moodle以以下格式在用户表中保存散列密码:
如果存储的密码是: $2y$10$UB6vKrpw227eqVXj2PiPou9c0eRtxsdU02fo9.wc3VtsA2FI.gS6a
则: $2y$=哈希算法ID(crypt_blowfish),用美元符号括起来。
10$=使用该算法的成本(两个数字加美元符号)。
UB6vKrpw227eqVXj2PiPou=随机生成的安全盐(22个字符)。
9c0eRtxsdU02fo9.wc3VtsA2FI.gS6a=哈希值(31个字符)。
我有纯文本明文密码。我无法想出如何使用Python检查它。
1个回答

2

使用bcrypt很容易实现:

pip install bcrypt

然后就只需要调用checkpw()函数:

import bcrypt

hashed = b'$2y$10$UB6vKrpw227eqVXj2PiPou9c0eRtxsdU02fo9.wc3VtsA2FI.gS6a'

password = input('Enter password:').encode()
if bcrypt.checkpw(password, hashed):
    print('Correct password entered!')
else:
    print('Password is wrong!')

请注意,bcrypt使用的是字节而不是字符串,这就是为什么用户输入必须通过 .encode() 进行处理的原因。

难道不是 pip install py-bcrypt 吗?而且 hashed 看起来是静态的。 - sphoenix
@sphoenix 不,根据 https://pypi.org/project/bcrypt/ 应该是 pip install bcrypt。不过我自己是用 anaconda 安装的,所以没有尝试过。很奇怪你会遇到那个错误,因为我这边一切正常。你用的是哪个 Python 版本和哪个 bcrypt 版本(bcrypt.__version__)? - JohanL
@sphoenix 你说的“hashed是静态的”是什么意思?它是一个bytes对象,很可能是通过使用用户名作为键查找该值得到的。 - JohanL
python 3.5.2, bcrypt: 3.1.4 - sphoenix
@sphoenix,你复制粘贴我提供的代码时出现了错误?这很奇怪,因为在我的系统上它似乎正常工作。然而,由于我们不知道初始密码,很难确定它是否被正确评估。 - JohanL
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接