MonoTouch在getter / setter中添加加密

时间:2014-07-16 21:42:14

标签: sqlite encryption xamarin.ios

我在我的应用程序中使用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); 
        }
    }  

这不起作用。实现这一目标的最佳方法是什么。

1 个答案:

答案 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编码:)。确保不是这种情况,并且您的密钥受到操作系统提供的任何内容的正确保护 - 不要将其存储在配置文件或代码中。