在 LINQ-to-sql 中加密字段值

Encrypt field value in LINQ-to-sql

我正在尝试为

的功能采用更好的加密方法
Person.FirstName = Encrypt(rawFirstName);
Person.sensitiveInfo = Encrypt(sensitiveInfo);

我不想在每次使用此类数据时都手动加密,因此我研究了修改 .designer 文件中的 .dbml 和 Person 对象。

我想到了这个:

.dbml 文件:

<Column Name="FirstName" Type="System.String" DbType="VarChar(256) NOT NULL" CanBeNull="false" /> 

.designer.cs 文件:

public partial class Person : INotifyPropertyChanging, INotifyPropertyChanged
{

    private string _FirstName;

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_FirstName", DbType="VarChar(256) NOT NULL", CanBeNull=false)]
    public string FirstName
    {
        get
        {
            return Decrypt(this._firstName);
        }
        set
        {
            if (Decrypt(this._firstName) != value)
            {
                this.OnFirstNameChanging(value);
                this.SendPropertyChanging();
                this._firstName = Encrypt(value);
                this.SendPropertyChanged("FirstName");
                this.OnFirstNameChanged();
            }
        }
    }
}

我现在面临的问题是它在程序内部工作(我已经在 set 中记录了 before/after 值以确保),但实际上会保存 未加密 值到数据库。看起来 storage _FirstName 变量没有像我想的那样保存到数据库中,而是使用了 get 方法。

我看过 this answer as well as this one,但我终其一生都无法弄清楚他们试图通过受保护变量和内部变量来传达什么。我缺少一些简单的东西吗?

最好的方法是对生成的 class 使用部分 class。数据库中存储的字段应该是FirstNameSecure、LastNameSecure等

然后在部分 class 创建属性 FirstName、LastName 等 encrypt/decrypt 它们的安全版本。