在保存密码之前,最好在数据库表中保存/插入散列字符串吗?

时间:2012-01-15 14:00:40

标签: python django hash bcrypt

import bcrypt

hashedstring = bcrypt.gensalt()
password = bcrypt.hashpw(password,hashedstring)

我是否应该每次在数据库表字段中保存hashedstring,以便在下次获取哈希字符串时成功登录?

或者我应该在代码中使用静态预生成的散列字符串吗?

2 个答案:

答案 0 :(得分:3)

用于散列密码的salt存储在生成的散列中 - 这意味着无需将其存储在数据库中,因为它可以从散列中恢复。

根据项目页面,可以这样做:

# Store a hash.
import bcrypt
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
store_in_db(user, hashed) #Where user is the user to load the hash for, and store_in_db does what it says on the tin.

# Check against an existing hash
import bcrypt
hashed = load_from_db(user) # (get the password of the user from database) Where user is the user to load the hash for, and load_from_db does what it says on the tin.
if bcrypt.hashpw(password, hashed) == hashed: # Where password is a plaintext password attempt.
        print "It matches"
else:
        print "It does not match"

是的,你应该为每个值使用不同的盐 - 这是BCrypt设计所鼓励的。

答案 1 :(得分:1)

简短回答:为每个密码使用新的盐。 (编辑:使用bcrypt,你不需要单独存储盐)

想象一下,如果攻击者从网站获取密码数据库。如果使用普通盐对所有密码进行哈希处理,则攻击者可以轻松找到使用常用密码的人:

hashedpwd = somehash('swordfish' + salt)

然后只需要一个数据库查询来查找使用'swordfish'作为密码的所有人。总会有相当一部分用户拥有相当普通的密码。

另一方面,如果每个密码都有自己的盐,并且数据库中有100万个密码,则攻击者必须计算100万个哈希才能检查一个密码,因此它更加安全。