繁体   English   中英

EF Code First加密/解密密码属性

[英]EF Code First Encrypt/Decrypt Password Property

我有如下模型:

public class User 
{
    private string password;
    public string Password
    {
        get { return Decrypt(password); }
        set { password = Encrypt(value); }
    }
}

我想从用户代码中轻松使用插入和选择密码,并以明文形式查看并希望逻辑层处理加密和解密。

但是在选择时,EF会再次setvalue ,因此从数据库获取的加密密码将再次加密,以便从客户端代码中获取,这是一个问题。 我也无法区分InsertSelect来设置条件。

我很可能这样做:

//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); }
    }


}

您也可以使用流畅的API来保持EF不直接存储它,而不是[NotMapped]

仅从存储库读取和写入实体,即通过您编写的数据访问类:

var myEntities = userRepository.GetUserById(id);

那么你的GetUserById()方法可以就地执行解密。 然后当你这样做

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;
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM