Hash 附加密码

Hash 附加密码,hash,passwords,string-hashing,Hash,Passwords,String Hashing,我一直在阅读有关存储和检查用户密码的正确程序,我对这些程序有点困惑 我认为它们是为了防止使用彩虹表之类的工具,但对我来说,将盐与散列一起存储似乎是一个潜在的安全问题。一个地方的数据太多,我不喜欢 我的想法是,我想让人们使用“幸运数字”从密码散列的一部分创建一个salt。 基本上,除了选择密码,用户还会选择一个“幸运数字”。然后,该数字将用作从散列传递中检索salt的起始索引 所以一个非常基本的例子是这样的 Pass = "Password" Lucky Number = "4" Pass Has

我一直在阅读有关存储和检查用户密码的正确程序,我对这些程序有点困惑

我认为它们是为了防止使用彩虹表之类的工具,但对我来说,将盐与散列一起存储似乎是一个潜在的安全问题。一个地方的数据太多,我不喜欢

我的想法是,我想让人们使用“幸运数字”从密码散列的一部分创建一个salt。 基本上,除了选择密码,用户还会选择一个“幸运数字”。然后,该数字将用作从散列传递中检索salt的起始索引

所以一个非常基本的例子是这样的

Pass = "Password"
Lucky Number = "4"
Pass Hash = "00003gebdksjh2h4"
Salt Length = "5"
Resulting Salt = "3gebd"

我的想法是,由于“幸运数字”不需要存储,因此盐也需要计算时间才能计算出来,因此任何攻击都更加困难。Plus意味着存储的数据稍微少一些。

它不会增加更多的安全性。使用rainbow表的目标是拥有字典单词和相关哈希组合的映射。通过对您计算的每个密码哈希使用或多或少不同的salt(通常不应该在字典中找到),您迫使攻击者为每个条目生成一组新的rainbow表,这在计算上会非常昂贵。攻击者在任何时候(除了生成哈希表)都不会计算哈希值,因此您的策略在此失败


另一方面,当使用常规的字典攻击时,攻击者只需要一个恒定的时间计算来计算salt,他只需计算一次就可以生成数百万或更多的哈希组合。只有在计算成本高于生成所有这些的情况下,它才会起作用,但是每次用户想要登录时,您都必须进行相同的计算,这是不可行的。

它不会增加更多的安全性-最重要的计算实际上是查找到散列的字符串映射。你的计算是常数时间,与之相比,这算不了什么。对于您计算的每个散列,有不同的(或实际上不同的)但不简单的(“1”、“2”等)盐就足够了。谢谢您的回答。这就是我真正想弄明白的。我猜如果盐的长度是固定的,那么这只是一个在散列中一步一步找到盐的例子。但是如果盐的长度也是一个基于“幸运数字”的变量呢?这仍然是一个常数时间计算吗?是的,散列的全部要点是,彩虹表是为给定的一组字典单词组合预先计算的,通过在salt中使用一些乱码,您无法将散列映射回密码(除非它碰巧也包含salt),因为它也与salt连接,因此,对于每一种新的盐,都必须重新计算彩虹表,这是非常昂贵的。不过,字典攻击仍然有效(这就是为什么单独使用nick作为salt通常不是一个好主意-它们通常是你可以在字典中找到的单词)。再次感谢。我想我现在明白了。不客气。我已经发布了一个答案,如果你愿意,你可以结束这个问题。