Hash 添加密码:最佳实践?

Hash 添加密码:最佳实践?,hash,cryptography,passwords,salt,Hash,Cryptography,Passwords,Salt,我一直很好奇。。。为哈希设置密码时,哪个更好:前缀还是后缀?为什么?或者这有关系,只要你有盐 解释:我们(希望)现在都知道,在散列密码以存储在数据库中之前,应该先输入密码[编辑:,这样您就可以避免类似的事情了]。通常,这是通过在通过散列算法之前将salt与密码连接起来来完成的。但例子各不相同。。。有些例子在密码前加盐。一些示例在密码后添加盐。我甚至见过一些试图把盐放在中间的东西。 那么哪种方法更好,为什么?是否有一种方法可以降低哈希冲突的可能性?我的谷歌搜索没有找到一个关于这个问题的像样的分析

我一直很好奇。。。为哈希设置密码时,哪个更好:前缀还是后缀?为什么?或者这有关系,只要你有盐

解释:我们(希望)现在都知道,在散列密码以存储在数据库中之前,应该先输入密码[编辑:,这样您就可以避免类似的事情了]。通常,这是通过在通过散列算法之前将salt与密码连接起来来完成的。但例子各不相同。。。有些例子在密码前加盐。一些示例在密码后添加盐。我甚至见过一些试图把盐放在中间的东西。 那么哪种方法更好,为什么?是否有一种方法可以降低哈希冲突的可能性?我的谷歌搜索没有找到一个关于这个问题的像样的分析


编辑:伟大的答案!很抱歉,我只能选择一个答案。:)

这应该没什么区别。无论你把盐放在哪里,杂烩都不容易猜到。散列冲突既罕见又不可预测,因为它是故意非线性的。如果它对安全性产生了影响,则表明是散列问题,而不是盐析问题。

前缀或后缀是不相关的,它只是为密码添加了一些熵和长度

你应该考虑这三件事:

  • 存储的每个密码的salt都必须不同。(这是一个很常见的误解。)
  • 使用加密安全的随机数生成器
  • 选择足够长的盐。想想生日的问题

  • 还有一个很好的问题,为什么你应该使用随机生成的盐而不是用户名(或其他个人数据)。如果你按照这些建议去做,你把盐放在哪里真的无关紧要。

    如果平台有供应商。我喜欢你不用担心盐的产生,如果你想的话,你可以让盐变得更浓。

    我认为这都是语义学的问题。把它放在前面或后面并不重要,除非是针对一个非常具体的威胁模型

    它在那里的事实应该能打败彩虹桌

    我提到的威胁模型是这样一种场景:对手可以在密码中添加/预先添加彩虹表中的常用盐。(比如国家安全局)你猜他们要么附加了它,要么在前面加了它,但不是两者都有。这很愚蠢,而且这是一个糟糕的猜测

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


    就像我说的。这是语义学。为每个密码选择一个不同的salt,一个长salt,并在其中包含奇数字符,如符号和ASCII码:·

    在密码中插入任意数量的salt字符是最不理想的情况,因此是最“安全”的,但在一般情况下,只要您对salt使用长的、唯一的每个密码字符串,它就没有多大意义。

    如果使用加密安全的散列,那么无论您是使用pre-fix还是postfix;散列的一个要点是,源数据中的单个位更改(无论在何处)应产生不同的散列

    然而,重要的是使用长盐,使用适当的加密PRNG生成它们,并具有每用户盐。在数据库中存储每个用户的数据不是一个安全问题,使用站点范围的散列是一个安全问题。

    首先,术语“rainbow table”经常被误用。“彩虹”表只是一种特殊类型的查找表,它允许对键进行特殊类型的数据压缩。通过以计算换取空间,一个需要1000 TB的查找表可以压缩1000倍,以便存储在更小的驱动器上

    您应该担心密码查找表的哈希,rainbow或其他

    @onebyone.livejournal.com:

    攻击者拥有的“彩虹表”不包括字典单词的散列,而是在完成散列计算之前的散列计算状态

    使用后缀salt强制输入密码文件可能比使用前缀salt更便宜:对于每个字典单词,依次加载状态,将salt字节添加到哈希中,然后最终确定。如果使用带前缀的salt,则每个字典单词的计算结果将没有任何共同之处

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


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

    真正的答案,似乎没有人提及过,是这样的。如果你正在实现你自己的加密,不管你认为你正在做的是多么琐碎的一部分,你都会犯错误

    是一种更好的方法,但即使您使用类似SHA-1的方法,您已经选择了一种算法,该算法由于其速度设计不适合密码哈希。使用类似或可能的方法,彻底解决问题

    哦,甚至不要考虑将得到的哈希值与编程语言或数据库字符串比较实用程序进行相等性比较。如果一个字符是E,则这些字符逐个比较,短路为
    false