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

lbr*_*him 2 c# entity-framework ef-code-first

我有如下模型:

public class User 
{
    private string password;
    public string Password
    {
        get { return Decrypt(password); }
        set { password = Encrypt(value); }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

不过,在选择时,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);
Run Code Online (Sandbox Code Playgroud)

相反,我希望从客户端代码中看不出来:

//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();
Run Code Online (Sandbox Code Playgroud)

希望我能够解释这个问题,有人可以指出我正确的方向.如果它是否可能.

Hen*_*man 9

更好的解决方案确实是使用哈希.

但是注入一些逻辑的一般模式:

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


}
Run Code Online (Sandbox Code Playgroud)

而不是[NotMapped]你也可以用流利的API,以保持EF直接存放.

  • Unmapped不是真正的属性,但是[NotMapped](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.schema.notmappedattribute(v = vs.110).aspx)是. (2认同)