EF Code First加密/解密密码属性
本文关键字:解密 密码 属性 加密 Code First EF | 更新日期: 2023-09-27 17:57:34
我有如下模型:
public class User
{
private string password;
public string Password
{
get { return Decrypt(password); }
set { password = Encrypt(value); }
}
}
我希望从用户代码使用只需插入和选择密码,并在明文中看到,并希望逻辑层处理加密和解密。
但当选择时,EF将再次set
和value
,因此从数据库中获得的加密密码将再次加密,以便我从客户端代码中获得,这是一个问题。我也无法区分Insert
和Select
来设置条件。
我可以很好地做到这一点:
//Insert
user.Password = Encrypt("123"); //Encrypt or Hash does not matter
context.Users.Add(user);
//Select
var hashedpassword = context.Users.Find(1).Select(u => u.Password).Single();
var unhashed = Decrypt(hashedpassword);
相反,我希望它不会从客户端代码中显而易见:
//Insert
user.Password = "123"; //Inserts encrypted password in database
context.Users.Add(user);
//Select
var cleartextpassword = context.Users.Find(1).Select(u => u.Password).Single();
希望我能解释这个问题,有人能给我指明正确的方向。是否可能。
更好的解决方案实际上是使用哈希。
但注入一些逻辑的一般模式:
public class User
{
// the mapped-to-column property
protected virtual string PasswordStored
{
get ;
set ;
}
[NotMapped]
public string Password
{
get { return Decrypt(PasswordStored); }
set { PasswordStored = Encrypt(value); }
}
}
除了[NotMapped]
,您还可以使用fluent API来防止EF直接存储它。
只能从存储库中读取和写入实体,即通过您编写的数据访问类:
var myEntities = userRepository.GetUserById(id);
那么您的CCD_ 6方法可以在适当的位置执行解密。然后当你做
userRepository.UpdateUser(myUser);
您可以使用UpdateUser()
方法再次对字段进行加密。
请找到以下方法,它将为您获得密码哈希:
public static string GetPasswordHash(this string password)
{
using (var sha1 = new SHA1Managed())
{
var hash = Encoding.UTF8.GetBytes(password);
var generatedHash = sha1.ComputeHash(hash);
var generatedHashString = Convert.ToBase64String(generatedHash);
return generatedHashString;
}
}