【发布时间】:2010-09-12 16:09:23
【问题描述】:
当我们设置 SaltEnabled 时,Microsoft Enterprise Library 的 HashProvider 中如何生成 salt?
对新机器来说是随机的吗?这是一个神奇的数字吗?
(我知道什么是盐,问题是企业库 HashProvider 中的盐的实际值是多少)
【问题讨论】:
标签: .net enterprise-library hash salt
当我们设置 SaltEnabled 时,Microsoft Enterprise Library 的 HashProvider 中如何生成 salt?
对新机器来说是随机的吗?这是一个神奇的数字吗?
(我知道什么是盐,问题是企业库 HashProvider 中的盐的实际值是多少)
【问题讨论】:
标签: .net enterprise-library hash salt
编辑:
有关示例实现,请参阅 Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.HashAlgorithmProvider。散列步骤是:
要与散列文本进行比较,您必须使用:
public bool CompareHash(byte[] plaintext, byte[] hashedtext)
相对于重新散列和比较。如果您重新哈希,则会生成一个新的随机盐,然后您就迷路了。
CompareHash 执行以下操作:
原文:
"如果在 HashProvider 上启用了 salt,则提供者将生成一个随机的字节序列,并将其添加到哈希中。如果您将哈希值与未哈希值进行比较,将从哈希值中提取 salt并用于在比较之前对未散列的值进行散列。”
和
“至于解码为哈希值。这是做不到的。创建哈希后,应该没有办法将其反转为原始值。 但是,您可以做的是通过相同的算法将未散列值与散列值进行比较,然后比较输出。”
来自http://www.codeplex.com/entlib/Thread/View.aspx?ThreadId=10284
【讨论】:
有点题外话:
这种盐是用来防止彩虹攻击的。彩虹攻击是一种尝试根据预先计算的哈希值的非常大(详尽/通常为几千兆字节)字典找出计算此哈希值的字符串是什么。
'Uncle' Jeff 有一个blog entry about this。
另外你可以查一下维基百科:
【讨论】:
所以我想我晚了几年,但我的理解是每次创建哈希时都会创建一个新的随机盐值。
【讨论】:
我回答了一个关于企业库及其用于散列的盐值的类似问题。
您可以在这里查看:https://stackoverflow.com/a/27247012/869376
亮点:
CryptographyUtility.GetRandomBytes(16); 方法在Microsoft.Practices.EnterpriseLibrary.Security.Cryptography 命名空间中生成的。这最终会调用一个名为 [DllImport("QCall", CharSet = CharSet.Unicode)]
private static extern void GetBytes(SafeProvHandle hProv, byte[] randomBytes, int count); 的 C 库方法
【讨论】: