2016-11-11 1 views
0

私は次の問題があります:キーで復号化がASP.NETのSQLコマンド

対称キーを使用してSQLデータベースの列を暗号化しました。今、私は、データベース内の暗号化された値を持っていると私は、キーを開き、クエリを実行する場合:Management Studioのクエリエディタで

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

それは大丈夫です、それが復号化された値を返します。

しかし、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(); 
    } 
} 

私の質問は、以下の通りである:

  • まず、なぜこれが動作しませんか?

  • 第2に、暗号化アルゴリズムを使用して(サーバーに要求するのではなく)アプリケーションの列の値を復号化するより良い方法がありますか?

+0

私はあなたがアプリケーションからそれを実行するときにコマンドの一部としてキーを開く必要があると思います。あなたはそれを試しましたか? – tattarrattat

+0

はい。私はそれを試した。 – StefanL19

答えて

0

理にかなっている唯一の説明はDecryptByKey前解読に開いている対称鍵を必要とするので、あなたはすでにSQL Server Management Studioでのキー開いているということです。開いているキーを確認するには、データを選択する直前に以下のsqlを実行します。あなたの目的は、データを復号化して鍵を開ける組み合わせることである場合

select * from sys.openkeys 

は、その後、DECRYPTBYKEYAUTOCERTは良い機能を使用することです。サーバーではなくクライアントでデータを暗号化および復号化する場合は、「SQL Server 2016常時暗号化」を参照する必要があります。カーディナリティの低いデータセットで確定的暗号化を使用すると、悪いアクターがデータを間接的に解読するためのハッシュテーブルを作成する可能性があるため、その設定方法に注意してください。また、一般に、クライアントはサーバーよりも攻撃されやすい傾向があります。

関連する問題