3

当我们设置 SaltEnabled 时,Microsoft Enterprise Library 的 HashProvider 中如何生成 salt?

新机器是随机的吗?这是一个神奇的数字吗?

(我知道什么是盐,问题是企业库 HashProvider 中的盐的实际值是多少)

4

4 回答 4

4

编辑:

有关示例实现,请参阅 Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.HashAlgorithmProvider。散列步骤是:

  1. 如果 SaltEnabled,使用 RNGCryptoServiceProvider 生成盐长度的随机字节。
  2. 将盐附加到明文中。
  3. 散列加盐的明文。
  4. 然后(这是重要的一步),再次将 salt 附加到hash

要与散列文本进行比较,您必须使用:

public bool CompareHash(byte[] plaintext, byte[] hashedtext)

与重新散列和比较。如果你重新散列,会生成一个新的随机盐,你就迷路了。

CompareHash 执行以下操作:

  1. 从散列文本中提取非散列盐。请记住,它是在上面的步骤 4 中附加的。
  2. 使用该盐计算明文的哈希值。
  3. 将新哈希与 hashedtext 减去 salt 进行比较。如果它们相同 - 真,否则为假。

原来的:

“如果在 HashProvider 上启用了 salt,则提供程序将生成一个随机的字节序列,并将其添加到散列中。如果您将散列值与未散列值进行比较,盐将从散列值中提取并用于在比较之前散列未散列的值。”

“至于解码为哈希值。这是做不到的。创建哈希后,应该无法将其反转为原始值。但是,您可以做的是通过将未哈希值与哈希值进行比较它通过相同的算法并比较输出。”

来自http://www.codeplex.com/entlib/Thread/View.aspx?ThreadId=10284

于 2008-09-24T17:23:14.367 回答
0

有点题外话:

这种盐用于防止彩虹攻击。彩虹攻击是一种尝试根据预先计算的哈希值的非常大(详尽/通常为几千兆字节)字典来找出计算该哈希值的字符串是什么的一种尝试。

“叔叔”杰夫一篇关于此的博客文章

此外,您可以查找 Wikipedia :

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

于 2008-10-05T23:19:49.110 回答
0

所以我想我晚了几年,但我的理解是每次创建哈希时都会创建一个新的随机盐值。

于 2010-12-15T20:18:48.173 回答
0

我回答了关于企业库及其用于散列的盐值的类似问题。

你可以在这里查看:https ://stackoverflow.com/a/27247012/869376

亮点:

  1. salt 是一个随机生成的 16 字节数组。
  2. 它是通过命名空间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);
  3. Base64 编码字符串的前 16 个字节是用于散列原始值的盐
于 2014-12-02T10:56:02.950 回答