【发布时间】:2017-03-26 12:50:01
【问题描述】:
我正在构建一个使用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函数解密密码?
【问题讨论】:
-
我想你会找到
check_password_hash不解密密码;我想它会对提供的密码进行哈希处理并将其与存储的哈希值进行比较(即它大致将是return self.password_hash == generate_password_hash(password))。散列(最好是加盐)的全部意义在于它不可逆;它是散列,而不是加密。 -
它的工作原理完全相同。这就是为什么你在散列之前加盐,否则有人可以对所有可能的密码运行散列算法并进行反向查找。该算法是单向的,它不能向后运行,就是重点。请阅读基础知识,这将回答您的大部分问题。
-
@KexAri ...你并不愚蠢,但你更像是 UN-HASHABLE :D :D :D
-
别担心;这并不愚蠢,你只是没有所有的信息。攻击者可以使用该函数针对哈希值测试密码,但这就是为什么我们建议人们使用长而不常见的密码;延长成功攻击所需的时间并劝阻大多数攻击者。