Enterprise Library HashProvider中的salt是什么? (SaltEnabled键)

时间:2008-09-24 09:11:10

标签: .net enterprise-library hash salt

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

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

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

4 个答案:

答案 0 :(得分:4)

编辑:

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

  1. 如果使用SaltEnabled,则使用RNGCryptoServiceProvider为盐长度生成随机字节。
  2. 将盐加入明文。
  3. 哈希盐渍明文。
  4. 然后(这是重要的一步),再次将盐添加到哈希
  5. 要与散列文本进行比较,您必须使用:

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

    与重新比较和比较。如果你重新散列,会产生一个新的随机盐,你就会丢失。

    CompareHash执行以下操作:

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

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

      “至于解码为哈希值。这是不可能的。在创建哈希之后,应该无法将其反转为原始值。 但是,您可以做的是将未散列值与散列值进行比较,方法是将其放在同一算法中并比较输出。“

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

答案 1 :(得分:0)

稍微偏离主题:

这种盐用于防止彩虹攻击。彩虹攻击是一种尝试,根据预先计算的哈希值非常大(通常为几十亿字节)的字典,找出计算此哈希值的字符串。

'Uncle' Jeffblog entry about this

此外,您可以查找维基百科:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

您可以在此处查看:https://stackoverflow.com/a/27247012/869376

亮点:

  1. salt是一个随机生成的16字节数组。
  2. 它是通过CryptographyUtility.GetRandomBytes(16);命名空间中的Microsoft.Practices.EnterpriseLibrary.Security.Cryptography方法生成的。这最终调用名为[DllImport("QCall", CharSet = CharSet.Unicode)] private static extern void GetBytes(SafeProvHandle hProv, byte[] randomBytes, int count);
  3. 的C库方法
  4. Base64编码字符串的前16个字节是用于散列原始值的salt
相关问题