werkzeug generate_password_hash,有什么意义吗?
werkzeug generate_password_hash, is there any point?
我正在构建一个使用 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
函数并解密密码吗?
本质上password_hash
使用单向函数来创建不可逆的散列。此外,它向哈希添加信息,例如哈希算法、salt 值、迭代计数,当然还有哈希值,这就是存储的内容。 password_verify
使用密码和 password_hash
结果中的附加信息再次创建哈希并比较哈希值。
另外重要的是 password_hash
遍历哈希函数使过程花费更长的时间,一个好的值是 100 毫秒。因此,攻击者所能做的最好的尝试是尝试密码以找到匹配的密码,并且每次尝试都需要花费大量时间。当然,更快的计算系统可以减少 ~100ms,但它仍然很昂贵。
我正在构建一个使用 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
函数并解密密码吗?
本质上password_hash
使用单向函数来创建不可逆的散列。此外,它向哈希添加信息,例如哈希算法、salt 值、迭代计数,当然还有哈希值,这就是存储的内容。 password_verify
使用密码和 password_hash
结果中的附加信息再次创建哈希并比较哈希值。
另外重要的是 password_hash
遍历哈希函数使过程花费更长的时间,一个好的值是 100 毫秒。因此,攻击者所能做的最好的尝试是尝试密码以找到匹配的密码,并且每次尝试都需要花费大量时间。当然,更快的计算系统可以减少 ~100ms,但它仍然很昂贵。