首页 > 解决方案 > 使用 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 完成的“公认”方式?

谢谢。

标签: entity-framework-core

解决方案


是否存在通常使用 Microsoft EF Core 完成的“公认”方式?

是的。EF Core 中使用的两种模式是

  1. 使用读取和写入支持字段的未映射属性

  2. 使用价值转换

值转换器允许在读取或写入数据库时​​转换属性值。这种转换可以是从一个值到另一个相同类型的值(例如,加密字符串)或从一种类型的值到另一种类型的值(例如,将枚举值与数据库中的字符串进行转换。)


推荐阅读