【问题标题】:Difference between Hashlib and System.Security.Cryptography.HashAlgorithmHashlib 和 System.Security.Cryptography.HashAlgorithm 之间的区别
【发布时间】:2014-06-07 14:33:06
【问题描述】:

我正在尝试了解散列算法的工作原理,特别是 SHA3-512。为了了解它是如何工作的,我在 Google 中搜索了代码并遇到了 Hashlib。该代码不起作用,因为我没有 Hashlib 库(不确定应该调用什么)。我怎样才能得到它,它是在 C# 中应用 SHA3-512 的唯一方法吗?

我想知道的一些基本的东西,

  1. 什么是Hashlib

  2. 它是图书馆吗?

  3. HashlibSystem.Security.Cryptography.HashAlgorithm的输出结果/工作流程/功能是否相同?如果不是,那它们有什么区别呢?

编辑:很抱歉从中间删除了几个问题。因为我觉得他们不再需要在这里展示了。

【问题讨论】:

    标签: c# hashlib hashalgorithm


    【解决方案1】:

    注意: 2017 年更新。

    哈希库

    Hashlib 是一个哈希实现库:

    https://hashlib.codeplex.com/

    它包括很多加密和非加密哈希的实现——.NET 框架(在System.Security.Cryptography 中)已经支持的和不支持的。您需要它(或其他外部实现)来支持 SHA-3。

    但是请注意,Hashlib 实际上并没有在其最终形式中包含 SHA-3,而是在对其进行一些调整之前的样子。这意味着,它的输出不会是您对 SHA-3 的期望。

    HashLib 的哈希算法使用与 .NET 的 HashAlgorithm 不同的架构 - 输出是相同的(对于相同的算法,例如 SHA256),用法不同。但它有一个包装器/适配器,可以使工作流程与HashAlgorithm 相同,例如:

    IHash hash = HashFactory.Crypto.SHA3.CreateKeccak512();
    HashAlgorithm hashAlgo = HashFactory.Wrappers.HashToHashAlgorithm(hash);
    // Now hashAlgo can be used the same as any .NET HashAlgorithm, e.g.:
    
    // Create byte input from string encoded as UTF-8
    byte[] input = Encoding.UTF8.GetBytes("Hello Keccak!");
    
    byte[] output = hashAlgo.ComputeHash(bytes);
    

    但请注意,Keccak512 与 SHA-3 不同 - 它不会提供与实际 512 位 SHA-3 实现相同的哈希值。

    在 C# 中最终 SHA-3 的实际实现仍然很少(2017 年) - 与在 Hashlib 中实现的 Keccak 的差异非常小,尽管它对输出有重大影响,例如散列算法 - 由于 Wikipedia 不再提供差异示例,这里有一个:

    Keccak-512('abc') =
    Keccak[1024]('abc', 512) =
        18 58 7d c2 ea 10 6b 9a 15 63 e3 2b 33 12 42 1c
        a1 64 c7 f1 f0 7b c9 22 a9 c8 3d 77 ce a3 a1 e5
        d0 c6 99 10 73 90 25 37 2d c1 4a c9 64 26 29 37
        95 40 c1 7e 2a 65 b1 9d 77 aa 51 1a 9d 00 bb 96
    
    SHA3-512('abc') =
    Keccak[1024]('abc' || 01, 512) =
        b7 51 85 0b 1a 57 16 8a 56 93 cd 92 4b 6b 09 6e
        08 f6 21 82 74 44 f7 0d 88 4f 5d 02 40 d2 71 2e
        10 e1 16 e9 19 2a f3 c9 1a 7e c5 76 47 e3 93 40
        57 34 0b 4c f4 08 d5 a5 65 92 f8 27 4e ec 53 f0
    

    Keccak[c](M || s, d) 表示“具有容量 c消息 M后缀位 s输出大小 d。”

    这(来自维基百科文章)是“标准”Keccak(和 Hashlib 的实现)与当前规范中的 SHA-3 之间的唯一区别:

    对于 SHA3-n,在填充之前将额外的两位 01 附加到消息中。

    在不知道 Hashlib 的工作原理的情况下,实现它(例如通过修补 Hashlib 代码)并非易事。

    那么,你应该使用 SHA-3 吗?

    这取决于您想要它的用途 - 如果您想要与最终确定的 SHA-3 标准兼容,那就不好了。

    整个 Keccak 系列,独立于 SHA-3,本身就是一个标准 - 但 NIST 对 SHA-3 的调整仍然是 Keccak - 只是它的一个特定子集(很像 AES 是 Rijndael 的一个子集)。当 SHA-3 最终出现在 .NET 框架本身中时,它可能只是带有 NIST 选择的参数的 SHA-3,而不是带有可调整参数的通用 Keccak。

    SHA-512(对现已删除的部分问题的回答)

    SHA-512 是 SHA-2 512 位 - 与 SHA-3 512 相同。也就是说,要使用它,您只需导入 System.Security.Cryptography - using 在这种情况下导入 命名空间 - 使命名空间内的类可用于您的代码。

    之后,工作流程与任何其他HashAlgorithm 相同。

    那么,我应该使用 SHA-2 还是 SHA-3 对密码进行哈希处理?

    两者都不是。或者至少不是靠他们自己。虽然盐可以改善问题,但这也不是最佳的安全性。见How to securely hash passwords,具体从:

    一个基本的散列函数,即使安全作为一个散列函数,也不适合密码散列

    【讨论】:

    • 感谢您的回答。您提到,“或其他外部实现 - 支持 SHA-3。”这究竟是什么另一个外部实现?我刚刚下载了 hashlib2.1 但它有错误。
    • " 它的输出不会是您对 SHA-3 的期望。" ---如果是这种情况,那么我根本不应该使用或尝试使用 hashlib。
    • 谢谢你!现在我所有的困惑都消失了。我很清楚 SHA3-512 和 Keccak-512。我正在做一个关于分组密码的项目,并希望对密码进行哈希处理。由于 SHA3-512 仍然是草案,所以我应该使用 SHA2-512。
    • SHA3-n,都是草稿吗?
    • 最后一件事(只是添加一些新的疑问 ;-) ) - 关于使用 SHA-3、SHA-2 或任何哈希算法来对密码进行哈希处理,请看一下:security.stackexchange.com/questions/211/…(将链接更改为提供更多信息的问题/答案)
    【解决方案2】:

    Hashlib 是什么?

    基本上它是一个实现许多哈希算法的库。

    它是图书馆吗?

    是的

    是Hashlib的输出结果/工作过程/功能和 System.Security.Cryptography.HashAlgorithm 一样吗?如果不是,那是什么 他们有什么区别?

    是的。

    Hashlib 提供了HashLib.HashFactory.Wrappers,可用于将 hashlib 提供的实现转换为System.Security.Cryptography.HashAlgorithm

    可以这样使用。

    IHash hash = HashFactory.Crypto.CreateSHA256();
    System.Security.Cryptography.HashAlgorithm algorith = HashLib.HashFactory.Wrappers.HashToHashAlgorithm(hash);
    

    【讨论】:

    • 所以,基本上“Hashlib”将其输出提供给“System.Security.Cryptography.HashAlgorithm”。这样做有什么好处?我可以轻松地改用“SHA512Managed()”类。你不同意吗?
    • HashLib 不会“将其输出”提供给任何东西。 Justin(和我)提供的代码只是让您使用具有与HashAlgorithm 相同的接口(如在方法和属性中)的HashLib 算法。使用 HashLib 的好处是获得对 .NET 本身中实现的哈希算法的支持。此外,还支持具有简化的 .NET 框架的平台,因为 HashLib 还拥有自己的完整 .NET 框架提供的所有算法的实现。是的,如果您需要的话,您可以使用SHA512Managed(或SHA512)——并且您的目标支持它。但请注意,它不是 SHA-3。
    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    • 2015-10-04
    相关资源
    最近更新 更多