【问题标题】:Decrypt by key not working ASP.NET sql command密钥解密不起作用 ASP.NET sql 命令
【发布时间】:2017-03-25 22:28:44
【问题描述】:

我有以下问题:

我使用对称密钥加密了我的 SQL 数据库中的一列。现在我在数据库中有加密值,当我打开密钥并执行查询时:

SELECT Convert(varchar, DECRYPTBYKEY(ColumnName)) as ClientSecret 
FROM dbo.Sample

在 Management Studio 查询编辑器中没问题,它会返回解密后的值。

但是当我尝试从我的 ASP.NET 应用程序中执行与 SqlCommand 相同的操作时,它返回 null。

代码:

string query = "SELECT Convert(varchar, DECRYPTBYKEY(ColumnName)) as ClientSecret FROM dbo.Sample";

var con = ConfigurationManager.ConnectionStrings["connectionName"].ConnectionString;

using (SqlConnection connection = new SqlConnection(con))
{
    SqlCommand command = new SqlCommand(query, connection);

    connection.Open();

    SqlDataReader reader = command.ExecuteReader();

    try
    {
        while (reader.Read())
        {
            //the value of client secret here is null
            var readerTest = reader["ClientSecret"];
        }
    }
    finally
    {
        // Always call Close when done reading.
        reader.Close();
    }
}

我的问题如下:

  • 首先,为什么这不起作用?

  • 其次,有没有更好的方法通过使用其加密算法来解密应用程序中列的值(而不是通过要求服务器来解密)?

【问题讨论】:

  • 我认为当您从应用程序运行它时,您需要将密钥作为命令的一部分打开。你试过吗?
  • 是的。我试过了。

标签: asp.net sql-server encryption


【解决方案1】:

唯一有意义的解释是您已经在 SQL Server Management Studio 中打开了密钥,因为 DecryptByKey 要求在解密之前打开对称密钥。要检查哪些键是打开的,请在选择数据之前执行下面的 sql。

    select * from sys.openkeys 

如果您的意图是将打开密钥与解密数据结合起来,那么 DECRYPTBYKEYAUTOCERT 将是一个很好的功能。如果您想在客户端而不是服务器上加密和解密数据,您应该查看 SQL Server 2016 Always Encrypted。请注意它的配置方式,因为对具有低基数的数据集使用确定性加密可能会导致不良行为者创建哈希表以间接解密数据。此外,通常客户端比服务器更容易受到攻击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2018-09-26
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多