代码之家  ›  专栏  ›  技术社区  ›  nikib3ro

用LINQ加密列数据

  •  2
  • nikib3ro  · 技术社区  · 14 年前

    我想知道是否有简单的解决办法,或者我坚持以下几点:

    更新数据库时:

    dti.Pass = Crypter.Encrypt(dti.Pass);
    _db.SubmitChanges();
    

    从数据库中选择时:

    Data.DbTableItem dti = _db.Single(a=>a.Id == id);
    dti.Pass = Crypter.Decrypt(dti.Pass);
    

    意思是-我不太喜欢写重复的代码,这看起来像是Linq支持的逻辑性的东西;所以我想知道它是否是。

    3 回复  |  直到 14 年前
        1
  •  6
  •   SDReyes    14 年前

    您可以添加一个具有封装此逻辑的属性的分部类,如:

    public partial class DbTableItem
    {
      public String UnencryptedPass
      {
        get
        {
           return  Crypter.Decrypt(this.Pass);
        }
    
        set
        {
           this.Pass = Crypter.Encrypt(value)
        }
      }
    }
    

    希望有帮助:)

        2
  •  4
  •   Remus Rusanu    14 年前

    您应该使用SQL Server加密函数, ENCRYPTBYKEY DECRYPTBYKEY . 更好的是,使用 Transparent Database Encryption . 现在,您可以用存储在哪里的密钥加密和解密密码。在灾难恢复或各种高可用性方案中,数据库都有这种移动和恢复到全新机器上的坏习惯,您会发现,在数据库中存储加密数据以及在系统密钥存储(或更糟的是,在应用程序中)中存储加密密钥会给您留下一堆“完整”的信息。完全安全的数据,无法解密,因为您丢失了密钥。

        3
  •  4
  •   Oleks    14 年前

    你可以定义一个假货 Password 用于封装密码逻辑和原始密码字段(映射到数据库)的属性- PasswordInternal 在我的例子中)应该是 internal .

    public partial class YourEntity
    {
       public string Password
       {
            get
            {
                return Crypter.Decrypt(this.PasswordInternal)
            }
            set
            {
                this.PasswordInternal = Crypter.Encrypt(value)
            }
       }
    }
    

    Afaik,没有您想要的内置功能。