Hashlib和System.Security.Cryptography.HashAlgorithm之间的区别

Gil*_*eed 1 c# hashalgorithm hashlib

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

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

  1. 什么是Hashlib

  2. 它是图书馆吗?

  3. 是的输出结果/工作流程/功能HashlibSystem.Security.Cryptography.HashAlgorithm一样吗?如果没有,那么它们之间有什么区别?

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

Jim*_*iTh 7

注意: 2017年更新.

Hashlib

Hashlib是一个哈希实现库:

https://hashlib.codeplex.com/

它包括相当多的加密和非加密哈希的实现 - 这两者都已经被.NET框架(in 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);
Run Code Online (Sandbox Code Playgroud)

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

C#中最终SHA-3的实际实现仍然是(2017)很少和很远 - 与Hashlib中实现的Keccak的差异非常小,尽管它对输出有重大影响,就像哈希算法的情况一样 - 由于维基百科不再提供差异的例子,这里有一个:

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
Run Code Online (Sandbox Code Playgroud)

Keccak[c](M || s, d)表示"具有容量 c,消息 M,后缀位 s输出大小的 Keccak 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来进行散列密码?

他们俩都没有.或者至少他们自己都没有.虽然盐改善了问题,但这也不是最佳安全性.请参阅如何安全地哈希密码,具体来自:

即使作为哈希函数安全,基本哈希函数也不适用于密码哈希