【问题标题】:What is the salt in Enterprise Library HashProvider ? (SaltEnabled key)Enterprise Library HashProvider 中的盐是什么? (SaltEnabled 键)
【发布时间】:2010-09-12 16:09:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net enterprise-library hash salt


    【解决方案1】:

    编辑:

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

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

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

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

    相对于重新散列和比较。如果您重新哈希,则会生成一个新的随机盐,然后您就迷路了。

    CompareHash 执行以下操作:

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

    原文:

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

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

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

    【讨论】:

    • "如果在 HashProvider 上启用了 salt,则提供程序将生成一个随机的字节序列,并将其添加到哈希中。"但是它不会起作用,因为这个随机盐应该被存储,或者至少对于每台机器应该是静态的。
    • 很抱歉给您带来了困惑。请查看我的编辑以了解更多详细信息,我认为可以回答您的问题。
    【解决方案2】:

    有点题外话:

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

    'Uncle' Jeff 有一个blog entry about this

    另外你可以查一下维基百科:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        您可以在这里查看: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); 的 C 库方法
        3. Base64 编码字符串的前 16 个字节是用于散列原始值的盐

        【讨论】:

          猜你喜欢
          • 2014-11-02
          • 1970-01-01
          • 2023-04-04
          • 2013-07-23
          • 2011-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多