我正在尝试使用另一个应用程序(在不同的堆栈上运行)使用运行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
(略微更改了哈希本身)
非常感谢任何帮助。
谢谢, 拉贾拉姆
答案 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
中提取的哈希值进行比较(即,手动完成的所有内容)上面的解决方案)。