如何重新计算web2py的密码哈希?

时间:2016-02-25 04:43:46

标签: authentication web2py

我正在尝试使用另一个应用程序(在不同的堆栈上运行)使用运行web2py的现有应用程序进行身份验证。我想了解如何使用auth_user中的密码验证输入的密码?

我确实看到https://groups.google.com/forum/#!topic/web2py/tLAiqRaXG48,但我无法从那里得到那个。这就是我在做的事情:

导入hashlib 来自pbkdf2 import crypt 隐窝(hashlib.sha512(" MyPassword输入")hexdigest(),迭代= 1000)

我在db中的密码如下:

PBKDF2(1000,20,SHA512)$ $ b787f1e6dfe7da8f b280b42a152aa14a1944d35c6a070521251b85d1

(略微更改了哈希本身)

非常感谢任何帮助。

谢谢, 拉贾拉姆

1 个答案:

答案 0 :(得分:3)

首先,请注意,存储在密码字段中的值不仅仅是最终的散列值,还包括算法,每用户盐和最终散列值(全部由$符号分隔)。所以,假设我们有:

stored_password = 'pbkdf2(1000,20,sha512)$b787f1e6dfe7da8f$b280b42a152aa14a1944d35c6a070521251b85d1'

首先做类似的事情:

_, salt, hashed_password = stored_password.split('$')

现在,因为使用了pbkdf2,我们必须使用hashlib.pbkdf2_hmac来比较哈希值:

from hashlib import pbkdf2_hmac
entered_password = 'MyPassword'
is_match = hashed_password == pbkdf2_hmac('sha512', entered_password, salt,
                                          rounds=1000, dklen=20).encode('hex')

或者,如果您不介意将web2py validators.py模块复制到另一个系统,您可以这样做:

from validators import CRYPT
is_match = CRYPT()(entered_password)[0] == stored_password

注意,CRYPT()是一个可调用对象(与所有web2py验证器一样)。当您使用输入的密码调用它时,它将返回一个元组,其第一个元素是LazyCrypt对象。 LazyCrypt类已实现了自己的__eq__特殊方法,因此上面的==比较会触发该方法。它会自动从stored_password中提取摘要算法,salt和哈希值,计算entered_password的哈希值,并将其与从stored_password中提取的哈希值进行比较(即,手动完成的所有内容)上面的解决方案)。