【问题标题】:cannot authenticate hashed password in Flask无法在 Flask 中验证散列密码
【发布时间】:2014-11-23 17:56:18
【问题描述】:

我正在为烧瓶应用程序构建用户名/密码身份验证。当用户注册时,我将用户名和密码存储在一个 mongodb 文档中。

这是我的用户模型:

class User():

def __init__(self, userid=None,username=None,password=None):
    self.userid= userid
    self.username = username
    self.password = generate_password_hash(password)

def __repr__(self):
    return '<User %r>' % self.username

def is_authenticated(self):
    return True

def is_active(self):
    return True

def is_anonymous(self):
    return False

def get_id(self):
    try:
        return unicode(self.userid) 
    except NameError:
        return unicode(self.userid)  

我正在使用 werkzeug 库方法 generate_password_hash 和 check_password_hash 分别生成/检查密码。

这是我将用户数据转储到 mongodb 的代码:

def db_dump(data):
            k = {'username':data.username,'password':data.password}
            db.users.insert(k,True)

这是我通过用户名检索用户数据的代码:

def find_by_username(username):
        data = self.db.users.find_one({'username': username})
        user = User(userid=unicode(data['_id']),username=data['username'],password=data['password'])
        return user

这是我的问题。假设我有一个密码为“abcd”的用户“jon”。当我运行代码通过控制台检查新用户的密码哈希时,它工作正常:

>> check_password_hash(generate_password_hash('abcd'),'abcd')
True

但是,在 'jon' 注册并且他的信息已转储到数据库中之后,在我必须从数据库中检索散列密码的后续登录尝试中,检查不起作用:

>>check_password_hash(find_by_username('jon').password,'abcd')
False

知道为什么会这样吗?经过一番谷歌搜索后,我的第一直觉是,也许我需要以不同的方式在 mongodb 中存储或检索哈希密码,因为它似乎被存储为字符串。有什么想法吗?

【问题讨论】:

  • 这个问题你解决了吗?

标签: mongodb flask passwords


【解决方案1】:

我认为问题在于您在 find_by_username 方法中实例化 User 对象时对密码进行了双重哈希处理。该方法从包含散列密码的数据库中获取信息。然后,它使用该数据创建一个User 对象。 User 对象在其 __init__ 方法期间调用 generate_password_hash。因此,密码被双重哈希处理,因此无法通过check_password_hash 检查。

您可能会考虑将密码哈希移动到一个函数,该函数在User 对象保存到数据库时调用。您想检测密码是否已更改,这样您就不会反复重新设置密码。可能还有其他方法可以处理此问题,但简而言之,您可能希望将密码散列移出 __init__ 调用。

【讨论】:

  • 正是我的问题 - 双重散列,因为我有一个 @validates 装饰器来散列放置在密码字段中的任何内容。
猜你喜欢
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2020-08-16
  • 2016-05-22
  • 1970-01-01
相关资源
最近更新 更多