企业库HashProvider中的盐是什么? (SaltEnabled键)
设置SaltEnabled时,如何在Microsoft Enterprise Library的HashProvider中生成盐?
新机器随机吗?这是个魔术数字吗?
(我知道什么是盐,问题是Enterprise Library HashProvider中a /盐的实际值是多少)
解决方案
编辑:
有关示例实现,请参见Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.HashAlgorithmProvider。散列步骤为:
- 如果为SaltEnabled,则使用RNGCryptoServiceProvider为盐长度生成随机字节。
- 将盐添加到明文中。
- 散列加盐的明文。
- 然后(这是重要的步骤),将盐重新添加到哈希中。
要与哈希文本进行比较,必须使用:
public bool CompareHash(byte[] plaintext, byte[] hashedtext)
与重新哈希和比较。如果我们重新哈希处理,则会生成新的随机盐,我们会迷路。
CompareHash执行以下操作:
- 从哈希文本中提取未哈希的盐。记住,它是在上面的第4步中添加的。
- 使用该盐计算明文的哈希值。
- 将新的哈希值与hashedtext减去salt进行比较。如果它们相同,则为true,否则为false。
原版的:
"如果在HashProvider上启用了盐,则提供程序将生成一个随机字节序列,该字节序列将被添加到哈希中。如果将哈希值与未哈希值进行比较,则盐将从该哈希值中提取出来,并用于比较之前先对未哈希的值进行哈希处理。"
和
"至于将其解码为散列值。这无法完成。创建散列后,应该没有办法将其反转为原始值。
但是,我们可以做的是通过将未哈希值与哈希值进行相同的算法比较并比较输出结果来比较它。
来自http://www.codeplex.com/entlib/Thread/View.aspx?ThreadId=10284
有点题外话:
该盐用于防止Rainbow攻击。彩虹攻击是一种尝试,它基于非常大的(通常是穷尽的/几千兆字节)预先计算的哈希字典来找出为该哈希计算的字符串。
"叔叔"杰夫(Jeff)有一个与此相关的博客条目。
另外,我们可以查找Wikipedia:
http://en.wikipedia.org/wiki/彩虹表
我想我还晚了几年,但是我的理解是,每次创建散列时都会创建一个新的随机盐值。