【问题标题】:SHA256 hash function giving unexpected resultSHA256 哈希函数给出意外结果
【发布时间】:2012-10-15 04:48:48
【问题描述】:

我正在使用 C#,想知道为什么 .Net 函数 PasswordDeriveBytes 返回的结果与其他 SHA256 算法不同。

我这样称呼它:

byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
var hash = PasswordDeriveBytes("1234567890", saltValueBytes, "SHA256", 1);
byte[] SHA256Pass = hash.GetBytes();

我希望得到哈希 c775e7b757ede630cd0aa1113bd102661ab38829ca52a6422ab782862f268646

但是我得到了 b????????A?n?z$?]??9,m^????@n?

我不知道问题是什么。这个函数是如何工作的以及为什么我得到的结果看起来不像 SHA 256 哈希。

谢谢

【问题讨论】:

  • 对于其他 SHA256 算法,您的意思是 sha256(salt || txt) 还是其他人的 PBKDF1 实现?
  • 确实,即使基本算法相同,也有很多方法可以散列一些东西。 PasswordDeriveBytes 的文档指出它是 PBKDF1 的变体,并不完全相同。

标签: c# encryption hash sha256


【解决方案1】:

你如何显示你的字节?看起来你拿走了它们并试图将它们直接转换为字符串,这会给你一些看起来很奇怪的字符(大约是预期字符数的一半)。请参阅this answer,了解一些用于转换为您所期望的十六进制字符串的选项。

【讨论】:

  • 转换我刚才做的字符串 Encoding.ASCII.GetString(SHA256Pass).
  • 您应该将字节数组转换为十六进制字符串!
  • 我已将字节数组转换为您的链接所述的字符串,但哈希值仍然不同。我得到 62c1f5b7b396dbaa9441dc6eed7a24fa5d8bdf392c6d5eae1fbbe9c4401e6eaa 但我期待 c775e7b757ede630cd0aa1113bd102661ab38829ca52a6422ab782862f268646。我看不出问题出在哪里。
  • @Thereisnospoon 确保在将输入字符串转换为参考实现使用的字节时使用相同的编码。您提供的代码使用 ASCII,也可以尝试 UTF7、UTF8 和 Unicode。
【解决方案2】:

PasswordDeriveBytes 不是哈希函数,它是密钥派生函数。它精确地遵循 PBKDF1,直到超过 20 字节的输出,PBKDF1 就是为此而设计的。当这种情况发生时,它会变成一个专有的、编程错误的、不安全的和未知的密钥延伸功能。

PBKDF1 使用 SHA-1 来实现密钥派生。 SHA-256 是一种更安全的散列函数,具有更大的输出。因此,这两个函数永远不会有相同的输出。如果你愿意,你将打破两者之一 - 或者更可能你会犯错误。

请注意,您应该使用 PBKDF2 而不是 PBKDF1,因为它更安全并且确实提供密钥延伸。

【讨论】:

  • 这很有趣。我将 SHA256 作为名称传递给 PasswordDeriveBytes 函数,所以我期待它会执行 SHA256。不是这样吗?
  • 确实,SHA-256 仅用作实现 key Key Derivation Function 的构建块,它不用于识别输出。就像 SHA-256 可以在数字签名算法(或 HMAC 中)一样。
  • 那么你说的是从PasswordDeriveBytes返回的哈希值实际上是SHA-1?
  • 在 PKCS#5 标准中查找 PBKDF1 并阅读。如果您对此有任何疑问,我将关注crypto。 SHA-1 确实确定了输出大小,而不是输出,因为它是 rau
  • 嗯,那是我的安卓手机搞砸了我的评论;它应该在结尾处显示“因为它运行了许多配置的迭代”。
猜你喜欢
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多