我在我的应用程序中使用RijndaelManaged Encryption的Sqlite数据库。加密工作正常。问题是如何将加密/解密添加到我的对象类。下面是一个班级
public class MTBL_USER
{
[PrimaryKey, AutoIncrement]
public int UserID { get; set; }
public string LoginID { get; set; }
public string Password { get; set; }
}
我想在getter和setter中为LoginID和Password添加加密/解密逻辑。
之类的东西 public string LoginID
{
get {
EncryptDecryptController decrypt = new EncryptDecryptController ();
return decrypt.Decrypt(LoginID);
}
set {
EncryptDecryptController encrypt = new EncryptDecryptController ();
LoginID = encrypt.Encrypt (value);
}
}
这不起作用。实现这一目标的最佳方法是什么。
答案 0 :(得分:0)
您的代码中包含StackOverflow,如果您从LoginID的set方法设置LoginID,则会发生这种情况。 尝试添加存储数据的私有字段。
私有字符串_encryptedLoginID = null;
public string LoginID{
get{ return (new EncruptDecryptController()).Decrypt(_encryptedLoginID);}
set{ _encryptedLoginID = (new EncruptDecryptController()).Encrypt(value);}
}
请注意,数据库/ json / xml序列化程序在询问时仍会看到解密后的值,因此这可能不适合您。
继续使用此代码,并将LoginID属性标记为已忽略的序列化方法;如果可以,请将其标记为内部。例如:
[DataMemberIgnore]
[JsonIgnore]
[XmlIgnore]
public string LoginID{...}
然后添加另一个直接与_encryptedLoginID
通信的属性
public string EncryptedLoginID {
get {return _encryptedLoginID;}
set {_encryptedLoginID=value;}
}
如果您想保留较少属性的内容,也可以将LoginID
重命名为CleartextLoginID,将EncryptedLoginID
重命名为LoginID。
请记住"加密"这是一个轻描淡写的术语,没有提到加密安全的一个非常重要的部分:密钥管理。如果您的密钥很容易从代码或配置文件中恢复,那么整个练习都是毫无意义的。你会惊讶地发现这种防御有时是多么容易。如果你只是让你的攻击者减速几个小时,你可能只是B64编码:)。确保不是这种情况,并且您的密钥受到操作系统提供的任何内容的正确保护 - 不要将其存储在配置文件或代码中。