首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何重写(在ASP.NET Identity中)由SHA1生成的密码哈希?

如何重写(在ASP.NET Identity中)由SHA1生成的密码哈希?
EN

Stack Overflow用户
提问于 2017-01-25 19:16:41
回答 1查看 800关注 0票数 5

我使用SHA1在我的网站上散列密码。我正在尝试迁移到ASP.NET Identity。我找到了验证旧密码(ASP.NET Identity default Password Hasher, how does it work and is it secure?)的方法:

代码语言:javascript
代码运行次数:0
运行
复制
public class CustomPasswordHasher : IPasswordHasher
{
 //....
  public static bool VerifyHashedPassword(string hashedPassword, string password)
  {
    byte[] buffer4;
    if (hashedPassword == null)
    {
        return false;
    }
    if (password == null)
    {
        throw new ArgumentNullException("password");
    }
// Old hash verification
    using (SHA1Managed sha1 = new SHA1Managed())
    {
      var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(password));
      var sb = new StringBuilder(hash.Length * 2);

      foreach (byte b in hash)
      {
          sb.Append(b.ToString("x2"));
      }

      if(hashedPassword == sb.ToString()) return true;
      else return false;
    }

// Identity hash verification
    byte[] src = Convert.FromBase64String(hashedPassword);
    if ((src.Length != 0x31) || (src[0] != 0))
    {
        return false;
    }
    byte[] dst = new byte[0x10];
    Buffer.BlockCopy(src, 1, dst, 0, 0x10);
    byte[] buffer3 = new byte[0x20];
    Buffer.BlockCopy(src, 0x11, buffer3, 0, 0x20);
    using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, dst, 0x3e8))
    {
        buffer4 = bytes.GetBytes(0x20);
    }
        return ByteArraysEqual(buffer3, buffer4);
  }
//....
}

在我的自定义ApplicationUserManager中,我设置了PasswordHasher属性:

代码语言:javascript
代码运行次数:0
运行
复制
//....
manager.PasswordHasher = new CustomPasswordHasher();
//....

现在,我想删除旧的散列(Sha1)并保存新的hash.How,我可以这样做吗?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-25 20:16:54

您不能这样做,直到用户尝试登录-您只有SHA1散列。从SHA1你不能转换成其他的散列算法。

但是当用户登录时,他们的密码在内存中,可以使用它来生成新的散列。下面是一些伪代码:

代码语言:javascript
代码运行次数:0
运行
复制
public void Login(String username, String password)
{
    if(DoesOldHashMatch(username, password)){
        var newHash = NewHasher.GetPasswordHash(password);
        UpdateUserPasswordHash(username, newHash);
        SetLoginCookie(username);
        return;
    }
    if(NewHashMatch(username, password))
    {
        SetLoginCookie(username);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41850205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档