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