通过密钥解密不工作的ASP.NET sql命令

时间:2016-11-11 16:30:02

标签: asp.net sql-server encryption

我有以下问题:

我使用Symmetric Key在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();
    }
}

我的问题如下:

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

  • 第二,有没有更好的方法来解密应用程序中列的值(而不是通过要求服务器执行它)?

1 个答案:

答案 0 :(得分:0)

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

    select * from sys.openkeys 

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