注意: 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,具体从:
一个基本的散列函数,即使安全作为一个散列函数,也不适合密码散列