Asp.net身份密码哈希

Edw*_*son 33 asp.net security identity asp.net-identity

新的ASP.net Identity项目为网站安全带来了一些有用的代码和接口.要使用接口实现自定义系统(而不是使用MVC 5模板中包含的标准Entity Framework实现),IPasswordHasher则需要使用.

IPasswordHasher ASP.net身份中的接口

namespace Microsoft.AspNet.Identity
{
    public interface IPasswordHasher
    {
         string HashPassword(string password);
         PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword);
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用密码salting在ASP.net身份中通过此接口进行更安全的加密?

And*_*own 58

健康警告以下答案:了解您正在使用的ASP.Net标识版本.如果它是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; // 1000, afaik, which is the min recommended for Rfc2898DeriveBytes
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);
Run Code Online (Sandbox Code Playgroud)

  • 以下是它现在的样子https://github.com/aspnet/Identity/blob/37d4e2b6ff3e64985f0fa7017108b164dce9233b/src/Microsoft.AspNet.Identity/PasswordHasher.cs它改变了上面描述的https://github.com/aspnet/身份/提交/ 37d4e2b6ff3e64985f0fa7017108b164dce9233b (2认同)

jd4*_*d4u 34

"是否可以使用密码腌制在ASP.net身份中通过此接口进行更安全的加密?"

是的,该接口是为Core Framework中已存在的PasswordHasher的新实现提供的.

另请注意,默认实现已使用Salt + Bytes.

创建自定义PasswordHasher(例如MyPasswordHasher)后,您可以将其分配给UserManager实例userManager.PasswordHasher=new MyPasswordHasher()

请参阅此类IPasswordHasher的一个示例

要使用接口实现自定义系统(而不是使用MVC 5模板中包含的标准实体框架实现),需要IPasswordHasher.

要从EF实现备用系统, - 您应实现所有Core接口. - 不需要IPasswordHasher实现.PasswordHasher已在Core框架中提供,因为它的实现.


Joe*_*use 8

我在从会员资格更新到AspNet.Identity时遇到了一个问题.Rfc2898哈希值与之前使用的哈希值不同.这是有充分理由的,但更改哈希值会要求所有用户重置密码.作为解决方案,此自定义实现使其向后兼容:

public class MyPasswordHasher : PasswordHasher {

   public FormsAuthPasswordFormat FormsAuthPasswordFormat { get; set; }

   public MyPasswordHasher(FormsAuthPasswordFormat format) {
      FormsAuthPasswordFormat = format;
   }

   public override string HashPassword(string password) {
      return FormsAuthentication.HashPasswordForStoringInConfigFile(password, FormsAuthPasswordFormat.ToString());
   }

   public override PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword) {
     var testHash = FormsAuthentication.HashPasswordForStoringInConfigFile(providedPassword, FormsAuthPasswordFormat.ToString());
     return hashedPassword.Equals(testHash) ? PasswordVerificationResult.Success : PasswordVerificationResult.Failed;
   }
}
Run Code Online (Sandbox Code Playgroud)

创建UserManager实例后,只需设置哈希:

Usermanager.PasswordHasher = new MyPasswordHasher(FormsAuthPasswordFormat.SHA1);
Run Code Online (Sandbox Code Playgroud)

代码抱怨该HashPasswordForStoringInConfigFile方法已被弃用,但这很好,因为我们知道整个练习是摆脱旧技术.