werkzeug generate_password_hash,有什么意义吗?

Kex*_*Ari 7 python werkzeug

我正在构建一个使用werkzeug 散列函数的 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
Run Code Online (Sandbox Code Playgroud)

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

zap*_*aph 9

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

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

  • 加密哈希是不可逆的,这是设计使然。除其他外,数据在此过程中有意丢失。它就像汉堡包,无法从汉堡包中重新创建转向。 (2认同)
  • @KexAri 你无法解散土豆! (2认同)