如果我使用HMAC Sha1作为散列算法,为什么PasswordDeriveBytes每次都会生成不同的密钥?

时间:2014-12-08 12:36:22

标签: c# encryption cryptography encryption-symmetric

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

为什么Rfc2898DerivedBytes每次都使用相同的密码,salt,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);

1 个答案:

答案 0 :(得分:5)

Rfc2898DerivedBytes使用PBKDF2和HMAC-SHA-1作为PRF(PRF本质上是一个键控哈希)。 PBKDF2需要一个PRF,并使用密码和salt / chaining值作为消息。

PasswordDeriveBytes使用PBKDF1和用户指定的哈希算法。此哈希应该是未加密的。但你传入了#HM; HMACSHA1"这是关键。在创建HMACSHA1实例时,.NET会填充随机密钥。由于PasswordDeriveBytes不能识别密钥(它需要一个非密钥哈希),因此每次都会以不同的哈希函数结束,因此每次都会产生不同的结果。