为什么如果我使用 HMACSha1 作为哈希算法,PasswordDerivedBytes 每次都会产生不同的密钥

本文关键字:密钥 PasswordDerivedBytes 如果 HMACSha1 算法 哈希 为什么 | 更新日期: 2023-09-27 18:33:36

我使用相同的密码和盐,但每次使用PasswordDerivedBytes时运行它时,它都会产生不同的密钥。但是,如果我使用 Sha1,它每次都会生成相同的密钥。为什么?

为什么 Rfc2898DerivedBytes 每次都产生相同的密钥,如果我使用相同的密码、盐、initvector 组合,知道它使用 HMACSha1?

下面添加的代码片段-

string passPhrase = "passPhrase";
byte[] saltBytes = Encoding.ASCII.GetBytes("saltValue");
int iterations = 2;
int keySize = 32;
string hashAlgo = "HMACSHA1";
Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(passPhrase, saltBytes, iterations);
byte[] keyBytes = derivedBytes.GetBytes(keySize);
PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, saltBytes, hashAlgo, iterations);
byte[] keyBytes2 = password.GetBytes(keySize);

为什么如果我使用 HMACSha1 作为哈希算法,PasswordDerivedBytes 每次都会产生不同的密钥

>Rfc2898DerivedBytes使用带有HMAC-SHA-1的PBKDF2作为PRF(PRF本质上是一个键控哈希(。PBKDF2 需要一个 PRF,并使用密码密钥和盐/链值作为消息。

PasswordDeriveBytes使用 PBKDF1 和用户指定的哈希算法。此哈希应取消键控。但是你传入了键控的"HMACSHA1"。创建 HMACSHA1 实例时,.NET 会填充一个随机键。由于PasswordDeriveBytes不是键感知的(它需要一个无键哈希(,它每次都会得到一个不同的哈希函数,因此每次都会产生不同的结果。