gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:51:35 28 4
gpt4 key购买 nike

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

一些我想知道的基本事情,

  1. 什么是Hashlib

  2. 它是图书馆吗?

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

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

最佳答案

注意: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 的区别非常小,尽管它对输出有重大影响,例如哈希算法 - 由于维基百科不再提供差异的示例,这里是一个:

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) 表示“Keccak with capacity c, message M后缀位 s输出大小 d。"

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

For SHA3-n, an additional two bits 01 are appended to the message before padding.

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

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

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

独立于 SHA-3 的整个 Keccak 系列本身就是一个标准 - 但 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 - 在这种情况下使用 导入命名空间 - 使命名空间内的类可供您的代码使用。

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

那么,我应该使用 SHA-2 还是 SHA-3 来散列密码?

两者都不是。或者至少他们自己都没有。虽然盐可以改善问题,但这也不是最佳的安全措施。参见 How to securely hash passwords ,特别是从:

A basic hash function, even if secure as a hash function, is not appropriate for password hashing

关于c# - Hashlib 和 System.Security.Cryptography.HashAlgorithm 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24098253/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com