【问题标题】:Custom bcrypt validation with Web2py使用 Web2py 自定义 bcrypt 验证
【发布时间】:2017-01-05 08:45:04
【问题描述】:

我有一个auth.login() 用于登录的表单。

我想要实现的是:当我输入一个username和一个password时, 验证器获取 password 并计算其 bcrypt 哈希并将其与存储在 MySQL dB 中的哈希进行比较。

现在,感谢 Anthony,我了解到需要修改 CRYPT() 方法。

到目前为止我在db.py 中拥有的东西:

def check(value):
//do bcrypt logic here

class CUSTOM_CRYPT:
    def __init__(self, error_message='error'):
        self.e = error_message
    def __call__(self, value):
        if check(value):
            return (value, None)
        return (value, self.e)

custom_auth_table.password.requires = [IS_STRONG(min=5, special=0, upper=0, number=0),CUSTOM_CRYPT()]

这给了我错误:

Validation error, field:password <__restricted__.CUSTOM_CRYPT instance>

我怎样才能做到这一点?谢谢!

我的 MySQL 数据库(auth-user 表)只包含以下条目:

ID | Username | Password
1  | tom93    | $2b$12$5vkWB4HzKsOqvbII2IV9m.MqxLi9/fqrjbzyiett.a.6iQEf/p6Su
2  | jan88    | $2b$12$eovbX99oTIvz6ItgVsqI4e6o9KJuILHzZxnF.EVM0qbAU1xFrBi2.

【问题讨论】:

    标签: web2py


    【解决方案1】:

    不,您不希望自定义验证器进行检查(它不知道要检查什么——这是通过 web2py Auth 代码处理的)。相反,验证器应该简单地用于将传入的明文密码转换为您要存储在数据库中的密码哈希。工作流程如下:

    • 在注册时,提交的密码通过验证器,其输出(散列密码)存储在数据库中。
    • 登录时,提交的密码通过验证器并经过哈希处理。 web2py 的 Auth 登录方法然后将此哈希密码与存储在数据库中的值进行比较,如果不匹配则拒绝登录。

    所以,你想要这样的东西:

    def bcrypt_validator(password):
        return (bycrpt(password), None)
    
    custom_auth_table.password.requires = [IS_STRONG(min=5, special=0, upper=0, number=0),
                                           bcrypt_validator]
    

    bcrypt 函数(您必须定义)在哪里生成您要存储在数据库中的哈希。

    【讨论】:

    • 安东尼,我非常感谢您的解释! :)
    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多