werkzeug generate_password_hash,有什么意义吗?

问题描述 投票:3回答:1

我正在构建一个使用werkzeug's hashing functions的python应用程序。一个例子User模型:

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    password_hash = db.Column(db.String(128))

    # Custom property getter
    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')

    # Custom property setter
    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

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

我看到现在password被存储为数据库中的哈希值,任何看到哈希值的攻击者都不知道密码是什么而不解密它。然而,werkzeug的散列函数对许多应用来说都不是一个相当明显的选择吗?攻击者可以使用check_password_hash函数并解密密码吗?

python werkzeug
1个回答
4
投票

本质上,password_hash使用单向函数来创建不可逆的哈希。此外,它还向哈希添加了信息,例如哈希算法,盐值,迭代计数以及哈希值,这就是存储的内容。 password_verify获取密码和password_hash结果中的附加信息,以再次创建哈希并比较哈希值。

此外,重要的是password_hash迭代哈希函数以使该过程需要更长时间,一个好的值是100毫秒。因此,攻击者可以做到最好,尝试使用密码找到匹配的密码,每次尝试都需要花费大量时间。当然,更快的计算系统可以减少~100ms,但仍然是昂贵的。

© www.soinside.com 2019 - 2024. All rights reserved.