【问题标题】:Is it better to save/insert the hashed string in database table before saving the password?在保存密码之前在数据库表中保存/插入散列字符串更好吗?
【发布时间】:2012-02-10 19:32:57
【问题描述】:
import bcrypt

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

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

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

【问题讨论】:

  • 为每个密码生成一个新的 salt 并将它们与密码一起存储会更安全。
  • (下面已经向我指出,bcrypt 在输出中包含盐,因此不需要单独存储)
  • 查看您最近的问题,并对您正在尝试做的事情有一些想法,我建议您阅读 Django 文档,特别是关于 Authentication 的内容。考虑到您没有时间阅读文档并且它们很复杂,您正在尝试使已经完成的事情变得更加复杂。如果您使用内置的 Django 功能,您已经以非常简单明了的方式实现了您想要的功能。现在你需要处理 bcrypt、salt 生成以及未来的其他问题。
  • @demalexx 阅读这些文档,我看到选项是 MD5、SHA1 和 Crypt - BCrypt 比所有这些选项都具有显着优势,因此根据应用程序,使用它可能是一个更好的主意,但我同意,在大多数情况下,重新发明轮子是没有意义的。
  • @Lattyware BCrypt 支持将包含在即将发布的 1.4 Django 版本中,并且还包含自动算法升级(这在 BCrypt 的情况下很有趣,因为您会希望不时升级工作因子到时间)所以大师可能想在 1.4 发布之前使用 SHA-1。

标签: python django hash bcrypt


【解决方案1】:

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

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

# 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 的设计所鼓励的。

【讨论】:

  • 哈希的全部意义在于您无法恢复其中的内容。
  • bcrypt 输出的哈希字符串是 xxxxyyyyyyyy(长度不准确),其中 xs 是盐,未经过散列,ys 是密码和盐的散列。因此,要获得盐,您只需获得前 n 个字符。
  • @ThomasK:关键是您无法恢复 密码。盐并不是什么秘密。它只是确保即使是两个相同的密码也会产生不同的哈希值。
  • 啊,抱歉 - 我以前没有遇到过 bcrypt。
  • 不用担心 - 大多数实现都不太清楚。
【解决方案2】:

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

想象一下,如果攻击者从网站获取密码数据库。如果所有密码都使用普通盐进行哈希处理,那么攻击者可以很容易地找到使用普通密码的人:

hashedpwd = somehash('swordfish' + salt)

然后只需要一个数据库查询就可以找到使用“swordfish”作为密码的每个人。总会有相当一部分用户使用非常常见的密码。

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

【讨论】:

  • 正如我在回答中指出的那样,在 BCrypt 的特定情况下,盐存储在哈希函数的输出中,将其单独存储在数据库中将是多余的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多