注: 2017 年更新。
哈希库
Hashlib 是一个哈希实现库:
https://hashlib.codeplex.com/
它包括相当多的加密和非加密哈希的实现——.NET 框架(in 中System.Security.Cryptography
)已经支持的和不支持的。您将需要它(或其他外部实现)来支持 SHA-3。
但是请注意,Hashlib 实际上并没有在其最终形式中包含 SHA-3,而是在对其进行一些调整之前的样子。这意味着,它的输出不会是您对 SHA-3 的期望。
HashLib 的HashAlgorithm
哈希算法使用与.NET 不同的体系结构- 输出是相同的(对于相同的算法,例如SHA256
),用法不同。但它有一个包装器/适配器,可以使工作流程与 for 相同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
和输出大小 的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 来散列密码?
他们俩都没有。或者至少不是靠他们自己。虽然盐可以改善问题,但这也不是最佳的安全性。请参阅如何安全地散列密码,特别是从以下内容开始:
基本散列函数,即使作为散列函数是安全的,也不适合密码散列