Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net身份密码哈希_Asp.net_Security_Identity_Asp.net Identity - Fatal编程技术网

Asp.net身份密码哈希

Asp.net身份密码哈希,asp.net,security,identity,asp.net-identity,Asp.net,Security,Identity,Asp.net Identity,新的ASP.net标识项目为网站安全带来了一些有用的代码和接口。要使用接口实现自定义系统(而不是使用MVC 5模板中包含的标准实体框架实现),需要IPasswordHasher IPasswordHasherASP.net标识中的接口 是否可以在ASP.net身份中并通过此接口使用密码加密进行更安全的加密 “是否可以使用密码盐析来实现更安全的加密?” ASP.net标识,并通过此接口?” 是的,该接口是为核心框架中已经存在的PasswordHasher的新实现提供的 还要注意,默认实现已经使用了

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

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

“是否可以使用密码盐析来实现更安全的加密?” ASP.net标识,并通过此接口?”

是的,该接口是为核心框架中已经存在的PasswordHasher的新实现提供的

还要注意,默认实现已经使用了Salt+字节

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

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

为了实施EF的替代系统, -您应实现所有核心接口。
-不需要IPasswordHasher实现。核心框架中已经提供了PasswordHasher作为它的实现。

健康警告下面的答案是:知道您使用的是哪个版本的ASP.Net标识。如果源代码是github存储库中较新的版本之一,则应直接参考源代码

在我写这篇文章时,密码处理程序的当前版本()与下面的答案明显不同。此较新版本支持多个哈希算法版本,并记录为(并且在您阅读本文时可能会进一步更改):

第2版:

  • 带HMAC-SHA1的PBKDF2,128位salt,256位子密钥,1000次迭代
  • (另请参见:SDL加密指南v5.1,第三部分)
  • 格式:
    {0x00,salt,subkey}
第3版:

  • 带HMAC-SHA256的PBKDF2,128位salt,256位子密钥,10000次迭代
  • 格式:
    {0x01,prf(UInt32),iter计数(UInt32),盐长度(UInt32),盐,子键}
  • (所有UINT32都以大端存储。)
原始答案对于ASP.Net Identity的原始版本仍然有效,如下所示:


@jd4u是正确的,但要说得更清楚一点,这与他的回答的评论不符:

  • Microsoft.AspNet.Identity.PasswordHasher:IPasswordHasher
    已经为您准备好了,
    • 更重要的是,它使用
      Rfc2898DeriveBytes
      生成salt和散列
    • 它使用行业标准PBKDF2(,OWASP)
  • 默认实现用作具体的
    IPasswordHasher
  • PasswordHasher
    反过来又是一个非常简单的
因此,如果您打算使用
Rfc2898DeriveBytes
,只需使用
PasswordHasher
——所有繁重的工作都已经为您完成(希望正确)

详细信息

PasswordHasher(当前)最终使用的完整代码非常接近:

int saltSize=16;
int字节数=32;
字节[]数组=新字节[1+saltSize+bytesRequired];
int迭代次数=SOME;//1000,afaik,这是Rfc2898DeriveBytes建议的最小值
使用(var pbkdf2=new Rfc2898DeriveBytes(密码、saltSize、迭代))
{
字节[]salt=pbkdf2.salt;
块拷贝(salt,0,数组,1,saltSize);
byte[]bytes=pbkdf2.GetBytes(需要字节);
Buffer.BlockCopy(字节,0,数组,saltSize+1,需要字节);
}
返回Convert.tobase64字符串(数组);

我从会员身份更新到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;
   }
}
创建UserManager实例后,只需设置哈希器:

Usermanager.PasswordHasher = new MyPasswordHasher(FormsAuthPasswordFormat.SHA1);

代码抱怨
HashPasswordForStoringInConfigFile
方法已被弃用,但这很好,因为我们知道,整个操作都是为了摆脱旧技术。

在传递密码之前,只需对密码加盐即可。
字符串提供的密码是否也需要进行散列?尽管它们提供了使用您自己的散列器的方法,但强烈建议不要这样做。另外,默认的哈希器已经对密码进行了加密,否则对同一密码进行两次哈希将得到类似的结果。谢谢!!!我需要一个独立于用户管理器的新方法来创建我的哈希密码,这个方法非常有效。这是我迄今为止找到的最有用的解释,框架中嵌入了一个默认哈希程序,所以当我保存一个用户时,我只需执行以下操作:var hash=new PasswordHasher().HashPassword(userViewModel.Password);var userAggregate=userAggregate.Create(userViewModel.Username,userViewModel.Email,hash,DateTime.Now.ToString());Troy Hunt在第58分钟还说了1000次哈希迭代。1)在PBKDF2-HMAC-SHA1中使用32字节的输出是个坏主意。输出超过本机大小(20字节)的数据会使防御者的速度降低2倍,而不会使攻击者的速度降低。2) 1000次迭代,如果有点低的话。这里是它现在的样子,它改变了上面所描述的,这很好。我也有同样的问题,我想将数千名用户从成员资格提供程序迁移到新的ASP.Identity。我会尝试一下。这基本上也是我最后做的。我想指出,您的构造函数名称不正确(应该是
MyPasswordHasher(…)
Usermanager.PasswordHasher = new MyPasswordHasher(FormsAuthPasswordFormat.SHA1);