entity-framework-core - 使用 Entity Framework Core 存储密码的最佳方式是什么?
问题描述
我有一个实体,我们称之为它User
,映射到我的数据库中的一个表,它有一个名为Password
:
public class User
{
[Required]
public string Password { get; set; }
[Required]
public string Username { get; set; }
}
而且我想确保在“设置”属性时始终加密密码,并在“获取”时解密。
就我而言,我需要一个双向加密算法,所以我不能使用散列函数。假设我有一个将执行加密/解密功能的 Cipher 对象,我想要一种方法来隐藏使用该类的客户端的纯文本密码。
我可以添加为我执行这些功能的其他方法:
. . .
public string GetDecryptedPassword(ICipher cipher)
{
return cipher.DecryptString(password);
}
public void SetEncrtypedPassword(ICipher cipher, password)
{
password = cipher.EncryptedString(password);
}
. . .
或者只是在课堂外进行解密/加密:
var cipher = new Cipher();
var user = new User { password = cipher.EncryptedString(aPassword), Username = "bob" };
context.Users.Add(user);
context.SaveChanges();
. . .
var cipher = new Cipher();
var user = context.Users.FirstOrDefault(u => u.Username = "bob);
var password = cipher.DecryptString(user.password);
但是,在后一种情况下,我必须到处跑,我触摸密码并添加加密/解密代码。这两种解决方案似乎都是一个笨拙的组合,实际上并不能解决有人在加密/解密方法背后设置/获取原始密码并发出信息的问题。
有没有更好的方法来做到这一点?是否存在通常使用 Microsoft EF Core 完成的“公认”方式?
谢谢。
解决方案
是否存在通常使用 Microsoft EF Core 完成的“公认”方式?
是的。EF Core 中使用的两种模式是
使用读取和写入支持字段的未映射属性
使用价值转换:
值转换器允许在读取或写入数据库时转换属性值。这种转换可以是从一个值到另一个相同类型的值(例如,加密字符串)或从一种类型的值到另一种类型的值(例如,将枚举值与数据库中的字符串进行转换。)
推荐阅读
- react-apollo - @apollo/react-hooks useQuery 中缺少道具映射器
- amazon-web-services - 成本和使用情况报告:期间结束时的规则
- r - R中的循环纬度分箱
- node.js - 事件 on.('event'.... 从未触发,为什么?
- swift - Swift NSImageView 翻页效果
- angular - Angular [scrollTop] 导致不需要的行为
- css - 我可以删除 Buefy-Bulma 布局组件中的填充吗?
- c - 在堆栈和堆上分配内存的 Eratosthenes 筛的内存错误
- sql-server - 使用 CTE 进行递归查询所需的帮助/建议
- c# - 如何从继承的 FromBody 模型中获得正确的类型?