【问题标题】:Compare passwords if hashed using random salt with sha512?如果使用随机盐与 sha512 进行散列比较密码?
【发布时间】:2017-12-08 19:06:48
【问题描述】:

我认为关于如何在数据库中存储密码的建议存在矛盾。 我们散列密码并将其存储在数据库中,当用户尝试登录时,我们以相同的方式散列他的输入字符串并与数据库进行比较。没关系。 但是有建议通过添加随机盐来增强该哈希值。 这是问题所在: 所以我们失去了比较的全部意义,因为存储在数据库中的第一个哈希值和登录时的盐值之间的盐值会不同? 如果将盐存储在 Db 中,那么加盐有什么好处?

【问题讨论】:

  • 另见 OWASP 的Secure Password Storage。 John Stevens 在创建威胁模型和设置安全控制以遏制威胁方面做得非常好。它包括加盐密码的原因。
  • “如果将盐存储在 Db 中,那么加盐有什么好处?” - 加盐可确保碰巧选择相同密码的两个用户不会在数据库中碰撞。没有它,用户可以使用他的密码来探测其他用户的密码(假设他/她有办法转储用户表)。一旦被击中,他/她就可以伪装成其他用户,因为他知道了密码。
  • @jww - 为相同的密码获取不同的哈希值只是加盐的一个小好处,实际原因是为了防止彩虹表攻击。
  • @martinstoeckli - 整个表的单一盐将提供防止预计算的保护。请参阅Secure Password Storage 详细介绍的威胁模型中的 ATTACK 1.2。
  • @jww - 这是真的,它与碰撞无关。预计算意味着你无法在知道全局盐之前计算彩虹表,但你可以构建 1 个彩虹表来获取所有密码。独特的盐完全否定了彩虹表的优势。我写了一个关于safely storing passwords的小教程,也许你有兴趣。

标签: c# hash cryptography sha password-hash


【解决方案1】:

您还可以储存盐。比较存储的哈希值和HASH(salt + input)。 salt的目的是防止两个用户使用相同的密码生成相同的hash。

【讨论】:

  • 并不是说salt不安全,因为我们说的是一个黑客,他会从数据库中获取密码,所以和salt一起,破解密码很容易。我错过了什么?
  • salt 被视为公共信息,其唯一目的是使每个哈希值唯一并防止基于预先计算的值(如彩虹表)的暴力攻击
【解决方案2】:

我们为每个密码生成随机盐的原因是,我们无法构建一个彩虹表来一次获取所有密码。相反,攻击者必须为每个盐/密码建立一个彩虹表。建立一个彩虹表来获取单个密码是没有意义的,因为如果找到匹配项,您可以停止搜索。

换句话说,加盐可以防止彩虹表的使用。即使知道盐,这个目的也能实现,仍然需要为每个密码构建一个彩虹表,这就是为什么我们可以将盐与哈希一起存储在数据库中。

顺便说一句:SHA-* 散列函数不适用于散列密码,而是应该使用密码散列函数,如 BCrypt、SCrypt、PBKDF2 或 Argon2。它们都有一个成本因素使散列变慢。

编辑

以下示例只是为了更好地理解,不应该这样添加盐:

1. Example with the same (global) salt for all passwords:

hash("Password1"+"o9*eiwrC49YAS2395%tu") => hash1
hash("Password2"+"o9*eiwrC49YAS2395%tu") => hash2
hash("Password3"+"o9*eiwrC49YAS2395%tu") => hash3

要找出Password1,我们可以用所有合理的密码和全局盐建立1个查找表。要找出 Password2,我们可以重用相同的查找表,因为所有密码都使用相同的全局盐。

2. Example with unique salts for each password:

hash("Password4"+"ierukElasidj42Swiekq") => hash4
hash("Password5"+"oeuoElwWPJckfk212344") => hash5
hash("Password6"+"PoiMnmdvhas98akd73lk") => hash6

要找出 Password4,我们必须使用所有合理的密码和盐 "ierukElasidj42Swiekq" 构建 1 个查找表。要找出 Password5,必须使用盐 "oeuoElwWPJckfk212344" 等建立另一个查找表。第一个示例需要 1 个查找表,第二个示例需要与密码一样多的查找表。

【讨论】:

  • 抱歉,但不明白为什么如果知道 salt 就不足以为所有密码建立一个查找表,它只是用每个猜测的密码再次散列已知的 salt,例如 salt + 'hello ' = qtgyw0002 盐 + 'martin123' = j3j2ki2900
  • @DanielMoreshet - 我添加了一个示例,让全局盐和唯一盐之间的区别更加清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多