c# - 检查登录 ASP.NET Core 上的加密密码
问题描述
我有一种加密用户密码的方法,如下所示:
public string EncryptPassword(string password)
{
// Encrypt password
byte[] salt = new byte[128 / 8]; // Generate a 128-bit salt using a secure PRNG
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(salt);
}
string encryptedPassw = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password,
salt: salt,
prf: KeyDerivationPrf.HMACSHA1,
iterationCount: 10000,
numBytesRequested: 256 / 8
));
return encryptedPassw;
}
但是我遇到了一个问题:我希望用户登录,但我不知道如何在登录时正确读取密码。谁能帮助知道如何解决它或遇到同样的问题。
解决方案
如何将盐存储在用户身边?
只需向用户添加一个属性,如下所示:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Password { get; set; }
public byte[] StoredSalt { get; set; }
//other properties...
}
当用户输入新密码时,需要用相同的盐对其进行加密,然后将其与数据库中的加密密码进行比较。
您可以参考以下代码:
定义一个临时使用的新类:
public class HashSalt
{
public string Hash { get; set; }
public byte[] Salt { get; set; }
}
注册和登录之类的东西:
[HttpPost]
public IActionResult Register(User user)
{
var hashsalt = EncryptPassword(user.Password);
user.Password = hashsalt.Hash;
user.StoredSalt = hashsalt.Salt;
_context.Users.Add(user);
_context.SaveChanges();
return View();
}
[HttpPost]
public IActionResult Login(User loginUser)
{
var user = _context.Users.FirstOrDefault(u => u.Name == loginUser.Name);
var isPasswordMatched = VerifyPassword(loginUser.Password, user.StoredSalt, user.Password);
if (isPasswordMatched)
{
//Login Successfull
}
else
{
//Login Failed
}
return View();
}
public HashSalt EncryptPassword(string password)
{
byte[] salt = new byte[128 / 8]; // Generate a 128-bit salt using a secure PRNG
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(salt);
}
string encryptedPassw = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password,
salt: salt,
prf: KeyDerivationPrf.HMACSHA1,
iterationCount: 10000,
numBytesRequested: 256 / 8
));
return new HashSalt { Hash = encryptedPassw , Salt = salt };
}
public bool VerifyPassword(string enteredPassword, byte[] salt, string storedPassword)
{
string encryptedPassw = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: enteredPassword,
salt: salt,
prf: KeyDerivationPrf.HMACSHA1,
iterationCount: 10000,
numBytesRequested: 256 / 8
));
return encryptedPassw == storedPassword;
}
推荐阅读
- ios - 首次登录应用后自动填充iOS12提示信息用户保存密码?
- c++ - Visual Studio 查找未覆盖的纯虚函数
- r - 将第一行粘贴到列表中的列名
- python - 使用 Numba 将单例数组分配给数组元素
- php - Symfony 3 - 教义 - 大查询的困难
- sqlite - SQLite 如何防止延迟事务的死锁?
- gradle - 我应该在 build.gradle 中添加什么来设置 Idea 的 Project JDK?
- javascript - ReactJS Accordion For循环键未定义?
- javascript - 如何使用 JavaScript 从 div 的输入字段中获取输入值
- jquery - 如何为下一部分分离模型弹出窗口?