0

我正在使用 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 哈希。

谢谢

4

2 回答 2

4

你如何显示你的字节?看起来你拿走了它们并试图将它们直接转换为字符串,这会给你一些看起来很奇怪的字符(大约是预期字符数的一半)。有关将转换为十六进制字符串的一些选项,请参阅此答案,就像您期望的那样。

于 2012-10-25T03:58:59.497 回答
2

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

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

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

于 2012-10-26T12:41:01.350 回答