我正在使用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哈希。
感谢
答案 0 :(得分:4)
你是如何显示字节的?看起来你拿了它们并尝试将它们直接转换为字符串,这会给你一些看起来很奇怪的字符(大约是预期字符数的一半)。有关转换为十六进制字符串的一些选项,请参阅this answer,就像您期望的那样。
答案 1 :(得分:2)
PasswordDeriveBytes不是哈希函数,它是密钥派生函数。它精确地跟随PBKDF1,直到超过20个字节的输出,为此设计了PBKDF1。当发生这种情况时,它会变成专有的,程序设计错误,不安全且未知的键拉伸功能。
PBKDF1使用SHA-1来实现密钥派生。 SHA-256是一个更安全的哈希函数,具有更大的输出。所以你永远不会为这两个函数提供相同的输出。如果你愿意的话,你将会破坏其中的一个 - 或者更可能是你犯了错误。
请注意,您应该在PBKDF1上使用PBKDF2,因为它更安全并且可以提供按键拉伸。