保存密码:最佳实践?

时间:2009-03-23 19:33:51

标签: hash cryptography passwords salt

我一直都很好奇...在使用哈希的密码:前缀或后缀时哪个更好?为什么?或者它是否重要,只要你加盐?

解释:我们(希望)现在知道我们应该salt密码,然后我们将其哈希存储在数据库中[编辑:所以你可以避免{{strong> {3}}]。通常,这是通过在将盐传递给散列算法之前将盐与密码连接来完成的。但是这些例子各不相同......有些例子在密码之前加盐。一些示例在密码之后添加salt 。我甚至看到过一些尝试将盐放在中间的人。

那么哪种方法更好,为什么?有没有一种方法可以减少哈希冲突的可能性?我的谷歌搜索没有找到关于这个问题的体面分析。

编辑:很棒的答案!对不起,我只能选一个答案。 :)

8 个答案:

答案 0 :(得分:105)

前缀或后缀无关紧要,只是为密码添加一些熵和长度。

你应该考虑这三件事:

  1. 您存储的每个密码的盐必须不同。 (这是一个很常见的误解。)
  2. 使用加密安全随机数生成器。
  3. 选择足够长的盐。想想生日问题。
  4. 对于另一个问题,您应该使用随机生成的盐而不是用户名(或其他个人数据),这是一个很好的answer by Dave Sherohman。如果你遵循这些建议,你把盐放在哪里都没关系。

答案 1 :(得分:25)

我认为这都是语义学。除非针对特定的威胁模型,否则将其置于之前或之后无关紧要。

事实上它应该打败彩虹表。

我提到的威胁模型将是对手可以在密码后附加/预先附加普通盐的彩虹表的情况。 (比如美国国家安全局)你猜测他们要么附加或附加,要么不是两者兼而有之。这很愚蠢,这是一个糟糕的猜测。

最好假设他们有能力存储这些彩虹表,但不是说,例如,在密码中间散布着奇怪盐的表格。在那个狭窄的情况下,我猜想穿插最好。

像我说的那样。这是语义。为每个密码选一个不同的盐,一个长盐,并在其中包含奇数字符,如符号和ASCII代码:©¤¡

答案 2 :(得分:18)

真正的答案,似乎没有人接触过,是both are wrong。如果您正在实施自己的加密,无论您认为自己在做什么都是微不足道的,那么正在犯错误。

HMAC是一种更好的方法,但即便如此,如果你使用像SHA-1这样的东西,你已经选择了一种算法,由于它的速度设计,它不适合密码散列。使用bcryptscrypt之类的内容,完全解决问题。

哦,甚至不考虑将产生的哈希值与您的编程语言或数据库字符串比较实用程序进行比较。如果字符不同,那些字符和短路的比较为false。所以现在攻击者可以使用统计方法来尝试找出哈希是什么,一次一个角色。

答案 3 :(得分:9)

它应该没有任何区别。无论你把盐放在哪里,哈希都不会轻易猜到。由于故意非线性,哈希碰撞既罕见又不可预测。如果它对安全性产生影响,则表明散列问题,而不是腌制问题。

答案 4 :(得分:7)

如果使用加密安全散列,无论你是pre-post还是postfix都无关紧要;散列点是源数据中的单个位更改(无论在哪里)应该产生不同的散列。

重要的是,使用长盐,使用适当的加密PRNG生成它们,并使用每个用户的盐。在数据库中存储每用户salt是安全问题,使用站点范围的哈希

答案 5 :(得分:5)

首先,术语“彩虹表”一直被滥用。 “彩虹”表只是查找表的特定,它允许对键进行特定类型的数据压缩。通过交换空间计算,一个需要1000 TB的查找表可以被压缩一千次,以便它可以存储在一个较小的驱动器驱动器上。

你应该担心哈希到密码查找表,彩虹或其他。

@ onebyone.livejournal.com:

  

攻击者的'彩虹表'不是字典单词的散列,而是在最终确定散列计算之前的散列计算状态。

     然后,使用postfix salt来强制使用前缀salt的密码文件条目可能会更便宜:对于每个字典单词,您将加载状态,将salt字节添加到散列中,然后完成它。使用前缀盐,每个字典单词的计算之间没有任何共同点。

对于通过输入字符串线性扫描的简单散列函数,例如简单的线性同余生成器,这是一种实际的攻击。但是加密安全散列函数被故意设计为具有多个循环,每个循环使用输入字符串的所有位,因此计算内部状态就在之前添加盐是没有意义的在第一轮之后。例如,SHA-1有80轮。

此外,像PBKDF这样的密码哈希算法多次组合它们的哈希函数(建议迭代PBKDF-2至少1000次,每次迭代应用SHA-1两次)使得这种攻击变得不切实际。

答案 6 :(得分:4)

BCrypt hash如果平台有提供商。我喜欢你怎么不担心创造盐,如果你愿意,你可以让它们变得更强。

答案 7 :(得分:2)

在密码中插入盐任意数量的字符是最不期望的情况,因此在社交方面最“安全”,但在一般情况下,只要您使用长,独特,它实际上并不是非常重要的 - 盐的每密码字符串。