【发布时间】:2016-07-21 04:51:07
【问题描述】:
使用sha256_crypt.encrypt("secretUserPassword") 创建用户密码哈希并将其存储到数据库中而不在哈希中添加 slat 是否可以保存?
如果是这样,是什么保护哈希免受彩虹表攻击?
这就是我在 Web 应用程序中创建新用户并将其存储到数据库中的方式:
admin = User()
admin.name = 'admin'
admin.password = sha256_crypt.encrypt("secretAdminPassword")
db.persist_user(admin)
这就是我检查凭据和登录用户的方式
username = request.form['username']
password = request.form['password']
user = user_from_db(username)
if sha256_crypt.verify(password, user.password):
login_user(user)
【问题讨论】:
-
根据the docs,自动添加盐。所以我想它很好。
-
顺便说一句,盐不会增加安全性。其目的是防止相同的密码产生相同的散列。很难想象这种保护没有用的情况,但单独来看,它根本不会提高 SHA256 加密的安全性。
-
@tripleee - 这更多是加盐的副作用,而不是主要目的。每个密码的唯一盐防止构建一个彩虹表来一次获取所有密码。相反,必须为每个密码构建一个彩虹表,这使得这种方法不可行。
-
@martinstoeckli 我看不出你写的和我写的有什么不同,更不用说反驳我写的了。
-
@tripleee - 差异确实很微妙,我并不是说你错了。其实有两个好处。首先它是的一个优势,相同的密码会导致不同的哈希值,所以人们无法判断两个客户使用了相同的密码,并且破解一个你不知道另一个也被破解了。这就是我理解你的评论的方式。另一件事是,使用盐确实提高了安全性(即使不是唯一的),因为你不能使用已经存在的彩虹表(例如,只是问谷歌),你必须建立彩虹表首先是这种盐。
标签: python security salt sha256 passlib