【问题标题】:How do I recompute web2py's password hash?如何重新计算 web2py 的密码哈希?
【发布时间】:2016-02-25 04:43:45
【问题描述】:

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

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

导入哈希库 从 pbkdf2 导入地穴 crypt(hashlib.sha512("MyPassword").hexdigest(),iterations=1000)

我在数据库中的密码是这样的:

pbkdf2(1000,20,sha512)$b787f1e6dfe7da8f$b280b42a152aa14a1944d35c6a070521251b85d1

(稍微改变了哈希本身)

任何帮助将不胜感激。

谢谢, 拉贾拉姆

【问题讨论】:

    标签: authentication web2py


    【解决方案1】:

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

    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 提取摘要算法、盐和哈希,计算entered_password 的哈希,并将其与从stored_password 提取的哈希进行比较(即,在上述解决方案中手动完成的所有操作)。

    【讨论】:

    • 要实际使用CRYPT()方法获取哈希值,只需将其转换为字符串,即str(CRYPT()(entered_password)[0])
    猜你喜欢
    • 2017-03-01
    • 2017-02-04
    • 2011-10-10
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多