LINQ to SQL在填充对象之前解密值

时间:2013-08-21 16:02:59

标签: c# sql linq encryption

我的一个表中有一个字段使用

加密
ENCRYPTBYPASSPHRASE(<passphrase>,<value>)

当值放入对象时,字段仍然是加密的,因此我无法对其进行任何操作。我无法创建视图或存储过程或任何其他解密数据库字段的项目,因为它失去了加密字段的目的。有没有办法使框架工作运行像

DECRYPTBYPASSPHRASE(<passphrase>, <columnName>)

在将值赋给对象之前?

现在我正在获取数据,然后调用ExecuteQuery来解密该值。并在我的数据模型类的加密值上分配该新值。它的工作原理,但我只是想知道它是否可以通过我不知道的一些选项自动完成。我试过搜索但没找到任何东西。

2 个答案:

答案 0 :(得分:1)

我假设您正在使用linq-to-sql,并且您从中提取的表的结构如下:

+--------+---------------+
| UserId |   Passphrase  |
+--------+---------------+
|      1 | laskdfmlsadkf |
+--------+---------------+

使用此信息,您可以在选择期间应用解密方法。

var password = "password";
var userId = 1;

var result = usertable.Where(c => c.UserId == userId).ToList()
.Select(t => new 
{
    Passphrase = DECRYPTBYPASSPHRASE(t.Passphrase)
}).First()

bool areSame = (password == result.Passphrase);

答案 1 :(得分:0)

this fiddle所示,以下SQL非常有效,

SELECT
            E.[Key],
            CAST(
                      DecryptByPassPhrase(
                          'test',
                          E.[Encrypted])
                AS
                    varchar(8000)) [Clear],
            E.[Other]
    FROM
            [Example] E;

所以使用this overload of ExecuteQuery做类似的事情,

var examples = context.ExecuteQuery<Example>(
    @"SELECT
                E.[Key],
                CAST(
                          DecryptByPassPhrase(
                              @p0,
                              E.[Encrypted])
                    AS
                        varchar(8000)) [Clear],
                E.[Other]
        FROM
                [Example] E;",
    passPhrase);

在一次通话中检索和解密您的数据。