3

対称キーを使用して SQL Server のデータを暗号化しようとしています。ユーザーが Web フォームからデータを送信するときに、SQL Server 内に保存した対称キーを使用してデータを暗号化したいと考えています。これを行う方法を見つけようとしています。現在、私は以下を実行しています:

USE myDb
GO

OPEN SYMMETRIC KEY myKey
DECRYPTION BY CERTIFICATE myCert
GO

INSERT INTO [myDb].[dbo].[passData]
           ([userid]
           ,[passName]
           ,[passLogin1]
           ,[passLogin2]
           ,[passPass1]
           ,[passPass2]
           ,[passWebsite]
           ,[passNote])
     VALUES
           ('1'
           ,'test_2'
           ,ENCRYPTBYKEY(KEY_GUID('myKey'),'somedata1')
           ,NULL
           ,ENCRYPTBYKEY(KEY_GUID('myKey'),'somedata2')
           ,NULL
           ,NULL
           ,NULL)
GO

これはうまく機能しますが、Web.Config ファイルからキーを開こうとすると、エラーが発生します。

C# コード:

    private void openKey(Dictionary<String, String> inputStrings)
    {
        try
        {
            SqlCommand seeqlCmd = new SqlCommand();
            String sqlInfo = ConfigurationManager.AppSettings.Get("OpenKey");
            seeqlCmd.CommandText = sqlInfo;
            seeqlCmd.CommandType = CommandType.Text;
            seeqlCmd.Connection = __SQLConn;

            seeqlCmd.ExecuteNonQuery();
            submitDataToDb(inputStrings);
            __SQLConn.Close();
        }
        catch (SqlException err)
        {
            // show error commands here
        }
    }

    private void submitDataToDb(Dictionary<String, String> sqlString)
    {
        try
        {
            SqlCommand sqlCmd = new SqlCommand();
            String confSet = ConfigurationManager.AppSettings.Get("DepositPasswordData");
            sqlCmd.CommandText = String.Format(confSet, sqlString["userID"], sqlString["passName"], sqlString["loginOne"], sqlString["loginTwo"], sqlString["passOne"], sqlString["passTwo"], sqlString["webSite"], sqlString["passNote"]);
            sqlCmd.CommandType = CommandType.Text;
            sqlCmd.Connection = __SQLConn;

            sqlCmd.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            // show error commands here
        }
    }

Web.Config ファイル

<add key="OpenKey" value="OPEN SYMMETRIC KEY myKey DECRYPTION BY CERTIFICATE myCert"/>
<add key="DepositPasswordData" value="INSERT INTO Passwords.dbo.userPassData{0} userid, passName, passLogin1, passLogin2, passPass1, passPass2, passWebsite, passNote) VALUES ('{0}', '{1}', 'ENCRYPTBYKEY(KEY_GUID('myKey '),'{2}')', 'ENCRYPTBYKEY(KEY_GUID('myKey'),'{3}')', 'ENCRYPTBYKEY(KEY_GUID('myKey'),'{4}')', 'ENCRYPTBYKEY(KEY_GUID('myKey'),'{5}')', '{6}', '{7}')" />

try/catch ステートメントからのエラー:

エラー番号: 102、エラー メッセージ: 'myKey' 付近の構文が正しくありません。: -2146232060 および System.Data.SqlClient.SqlErrorCollection

質問/問題:

  • エラーが発生するのはなぜですか?
  • キーにアクセスしたり、データを暗号化する別の方法はありますか?

追加:キー名を「myKey」から「myKeya」などに変更しようとしたところ、次のエラーが発生しました。

エラー番号: 15151、エラー メッセージ: 対称キー 'myKeya' が見つかりません。存在しないか、権限がないためです。: -2146232060 および System.Data.SqlClient.SqlErrorCollection

当然、「myKey」とは別の単語を使用していますが、使用している単語が何らかのキーワードであるかどうかを確認したところ、Google、bing、msdn の検索で出てきません...だから私は私はそこで安全だと思います。また、これは、データベースが実際にリクエストを受信して​​いるという点で私に手がかりを与えますが、別の方法でキーが必要です。うーん....

4

4 に答える 4

0

Web 設定でセミコロンをエスケープまたは削除する必要がありますか? 単なるアイデアであり、テストされていません。

于 2009-11-28T18:48:53.190 に答える
0

エラーがキーのオープンにあり、submitDataToDb の呼び出しにあると確信していますか?

于 2012-10-15T00:37:45.700 に答える
0

'myKey'構成ファイルで一重引用符を使用しないでください。構成ファイルを、正しく機能したと言ったステートメントと比較してください。唯一の違いは引用符です。SQL Server のドキュメントを見ると、キーも証明書も引用符で囲んではいけません。

于 2009-11-28T18:54:10.150 に答える
0

SQL Server Profilerでトレースを実行してみてください。次に、Web アプリが実行されている正確なステートメントを確認できます。そこから、そのステートメントを SQL Server Management Studio にカット アンド ペーストして、実行されるか、構文エラーがあるかを確認できます。実行された場合、ドニーが提案したようなアクセス許可の問題であるというヒントが得られます。

于 2009-11-28T20:33:21.027 に答える