【问题标题】:LINQ to SQL decrypt value before populating objectLINQ to SQL 在填充对象之前解密值
【发布时间】:2013-08-21 16:02:59
【问题描述】:

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

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

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

DECRYPTBYPASSPHRASE(<passphrase>, <columnName>)

在给对象赋值之前?

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

【问题讨论】:

  • 您如何自动知道passPhrase 以及转换为清除varbinary 的类型,还是要检索byte[]
  • 我知道密码短语现在我得到了解密调用 ExecuteQuery 的值,如下所示。
  • 我知道 PassPhrase 现在我得到了 Decrypt 调用 ExecuteQuery 的值,如下所示。 “Select CAST(DECRYPTBYPASSPHRASE('{0}', {1}) AS NVARCHAR(MAX)) AS {2} FROM Table Whered PrimaryKey = {3}” 其中 0 = 短语,1 = 列,2 = 返回的列名称, 3 = 我要解密的确切记录的密钥。所以我现在得到了值。只是它需要我多走一步。在将数据从数据库填充到对象后。我必须运行额外的查询来获取解密的值。

标签: c# sql linq encryption


【解决方案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);

【讨论】:

  • 我还没有机会回去试试这个。我希望很快能在这里度过一段时间。
  • DECRYPTBYPASSPHRASE 是 TSQL 函数,而不是 .Net 函数。
  • @Jodrell 您需要推送DECRYPTBYPASSPHRASE 存储过程in to your linq2sql model,以便在.NET 代码中使用它。
  • @ScottChamberlain,这个答案是否暗示了这一点?
  • DecryptByPassphrase 函数接受至少 2 个参数并返回一些明确的 varbinary,而不是用于与密码比较的密码。 technet.microsoft.com/en-us/library/ms188910.aspx
【解决方案2】:

正如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);

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

【讨论】:

  • 是的,我刚刚得出结论,我必须自己运行 ExecuteQuery 并提供查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2015-11-26
相关资源
最近更新 更多