每次为Same String值生成相同的Salt

时间:2013-06-11 22:59:31

标签: java security encryption hash salt

我需要在散列列中添加一个盐。此散列列也用作其中一个表中的索引。出于显而易见的原因,我不想对所有值使用相同的硬编码盐。

每次为给定的String生成唯一的SAME salt值的最佳方法是什么,所以当我散列值时,我得到相同的输出(以帮助我使用散列值进行搜索)。

更新: 感谢大家的投入。 更多细节 - 我必须加密数据库中的列。此列还用于搜索表中的行,加密后我们无法使用它进行搜索,因为我们有可能在以后的时间点更改加密密钥。现在为了解决这个问题,我们考虑在表中添加一个Hashed列,我们可以在其上执行搜索(因为我们不会更改Hashed算法,所以我们总是可以将它用于搜索目的)。为了使这个散列柱更安全,我们考虑添加盐。由于Salt应该是随机的,因此除非我们对所有行都使用相同的Salt,否则我们无法每次为相同的值生成相同的哈希函数。所以这就是为什么我试图想出一种方法,我每次都能为同一个String生成相同的盐。 但是我想在经过你们所有的评论和建议后,我确​​信这不是一个好的设计,我应该重新考虑我的方法:(

4 个答案:

答案 0 :(得分:4)

仅将hash-value用作索引或外键应该没有问题(只需在hash-value中包含salt),但我明白,你想要重新绑定行,只有原始的(unhashed) )价值。

这永远不会起作用,找不到具有正确盐渍哈希的列,以找到该行。通常这意味着,设计存在缺陷,散列值不应该是您必须搜索的内容。例如:要验证密码,您应该搜索用户名,然后使用找到的密码哈希验证密码。

如果您确定需要搜索此哈希值,那么您唯一的选择是不使用盐(或所有值使用相同的盐),或者加密值(不使用IV的双向加密) )。当然,这两种选择都是较弱的保护,而不是正确地对值进行散列。

更新:根据您的更新,您已在数据库中拥有加密值。这意味着,您可以搜索它,而无需哈希值。在进行查询之前,只需加密搜索到的值。

答案 1 :(得分:2)

这样做会破坏使用盐的目的。为了达到预期目的,盐应尽可能随机。

考虑一下 - 你可以使用字符串的散列作为“salt”,然后将原始字符串和“salt”第二次散列在一起。但结果哈希仍然只是原始字符串的衍生物。虽然这可能只对一个简单的彩虹表提供一点点安全性,但这还不够。

http://en.wikipedia.org/wiki/Rainbow_table#Defense_against_rainbow_tables

答案 2 :(得分:0)

salt可以与salted + hashed值存储在同一个表中。插入新记录时,生成一个新的随机盐,salt +哈希值,并保存该记录中的哈希值和盐。

答案 3 :(得分:-1)

Salt不需要特别安全,因此您可以使用非加密哈希(也许FNV hash)从字符串派生salt。然后,您可以使用加密哈希(如SHA-256)和salt一起生成安全哈希值。非加密哈希还具有更快的优势。