为C#中的HMACSHA512加密数据实现忘记密码的最佳方法是什么?

问题描述 投票:0回答:1

在我的asp.net核心应用程序中,我想实现忘记密码的情况(添加新密码并更新db中的哈希和盐)。当我保存用户时,它将创建用户名,密码哈希和密码盐。我自己不存储密码。我正在使用HMACSHA512进行密码哈希处理。

[我的创建用户方案如下:

    public async Task<User> CreateUser(User user, string password, int organizationId)
    {
        CreatePasswordHash(password, out byte[] passwordHash, out byte[] passwordSalt);

        user.PasswordHash = passwordHash;
        user.PasswordSalt = passwordSalt;
        user.Role = UserRole.User;

        await _context.Users.AddAsync(user);
        await _context.SaveChangesAsync();

        return user;
    }

    private void CreatePasswordHash(string password, out byte[] passwordHash, out byte[] 
     passwordSalt)
    {
        using var hmac = new HMACSHA512();
        passwordSalt = hmac.Key;
        passwordHash = hmac.ComputeHash(Encoding.UTF8.GetBytes(password));
    }

登录场景如下:

    public async Task<User> Login(string username, string password)
    {
        var user = await _context.Users.FirstOrDefaultAsync(x => x.Username == username);

        if (user == null)
            return null;

        return !VerifyPasswordHash(password, user.PasswordHash, user.PasswordSalt) ? null : 
    user;
    }

    private bool VerifyPasswordHash(string password, byte[] passwordHash, byte[] 
    passwordSalt)
    {
        using var hmac = new HMACSHA512(passwordSalt);
        var computedHash = hmac.ComputeHash(Encoding.UTF8.GetBytes(password));
        return !computedHash.Where((t, i) => t != passwordHash[i]).Any();
    }
c# security asp.net-core hash
1个回答
0
投票

有几种方法可以选择

  1. 为用户首次登录时维护一套安全性问题和答案,以便他可以使用安全性问题重设密码
  2. [构造用于重设密码的令牌,并在URL中用于重设密码,并向用户发送电子邮件。在此过程中,成功重置令牌会使令牌无效,并允许用户使用该应用程序。 (优先于1)

HTH

© www.soinside.com 2019 - 2024. All rights reserved.