3

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

ENCRYPTBYPASSPHRASE(<passphrase>,<value>)

当值被放入对象时,该字段仍然是加密的,所以我不能用它做任何事情。我无法创建视图或存储过程或任何其他解密数据库中字段的项目,因为这样就违背了加密字段的目的。有没有办法让框架运行类似

DECRYPTBYPASSPHRASE(<passphrase>, <columnName>)

在将值分配给对象之前?

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

4

2 回答 2

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);
于 2013-08-22T16:53:32.787 回答
0

正如这个小提琴所证明的,下面的 SQL 非常有效,

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

所以使用这个 ExecuteQuery 的重载来做类似的事情,

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

一次调用即可检索和解密您的数据。

于 2013-09-23T11:54:40.280 回答