2016-11-11 115 views
0

我有以下問題:通過密鑰解密不工作ASP.NET sql命令

我已經通過使用對稱密鑰在我的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(); 
    } 
} 

我的問題有以下幾點:

  • 首先,爲什麼不起作用?

  • 其次,有沒有更好的方法通過使用它的加密算法來解密應用程序中列的值(而不是通過要求服務器去做)?

+0

我認爲當您從應用程序運行它時,您需要將該鍵作爲命令的一部分來打開。你嘗試過嗎? – tattarrattat

+0

是的。我試過了。 – StefanL19

回答

0

唯一有意義的解釋是,您已經在SQL Server Management Studio中打開了密鑰,因爲DecryptByKey需要在解密之前打開對稱密鑰。要檢查哪些鍵已打開,請在選擇數據之前執行sql。

select * from sys.openkeys 

如果你的目的是結合了對數據解密打開鍵,然後DECRYPTBYKEYAUTOCERT將是一個很好的功能使用。如果您想要在客戶端而不是服務器上加密和解密數據,則應該查看SQL Server 2016 Always Encrypted。要小心它是如何配置的,因爲對具有低基數的數據集使用確定性加密可能導致不良演員創建散列表以間接解密數據的能力。而且,通常客戶端比服務器更容易受到攻擊。