健康警告: 了解您使用的ASP.Net Identity版本。如果是来自Github存储库的新版本之一,则应直接参考源代码。
我写这篇文章时,当前版本(3.0.0-rc1/.../PasswordHasher.cs)的密码处理程序与下面的答案显著不同。这个更新版本支持多个哈希算法版本,并且被记录为(并且在您阅读此文时可能会进一步改变):
版本2:
- PBKDF2使用HMAC-SHA1,128位盐,256位子密钥,1000次迭代。
- (另请参阅:SDL加密指南v5.1,第III部分)
- 格式:
{ 0x00, salt, subkey }
版本3:
- PBKDF2使用HMAC-SHA256,128位盐,256位子密钥,10000次迭代。
- 格式:
{ 0x01, prf (UInt32), iter count (UInt32), salt length (UInt32), salt, subkey }
- (所有UInt32都以big-endian方式存储。)
原始答案仍然适用于原始版本的ASP.Net Identity,如下所示:
@jd4u是正确的,但为了更详细地解释一下,这不能在他的答案中进行评论:
因此,如果您要使用 Rfc2898DeriveBytes
,只需使用 PasswordHasher
- 所有繁重的工作已经完成 (希望正确)。
详细信息
目前 PasswordHasher 使用的完整代码非常接近于:
int saltSize = 16;
int bytesRequired = 32;
byte[] array = new byte[1 + saltSize + bytesRequired];
int iterations = SOME;
using (var pbkdf2 = new Rfc2898DeriveBytes(password, saltSize, iterations))
{
byte[] salt = pbkdf2.Salt;
Buffer.BlockCopy(salt, 0, array, 1, saltSize);
byte[] bytes = pbkdf2.GetBytes(bytesRequired);
Buffer.BlockCopy(bytes, 0, array, saltSize+1, bytesRequired);
}
return Convert.ToBase64String(array);
providedPassword
是否也需要进行哈希处理? - Djeroen