web-dev-qa-db-ja.com

以前に暗号化されたデータを復号化するとNULLが返される

以前に暗号化されてテーブルに保存されたデータの復号化に問題があります。

対称キーを開き、EncyptByKey()を使用してデータを暗号化した後、DecryptByKeyAutoCert()を使用して復号化しようとすると、NULL値が取得されます。

以下は、私のセットアップで使用し、復号化を試みるものです。

キーと証明書を作成する

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'master'; 
 
 CREATE CERTIFICATE cert_dbKeys 
 ENCRYPTION BY PASSWORD = 'abcd' 
 WITH SUBJECT = 'Database encryption key'、 
 EXPIRY_DATE = '20201031'; 
 
 CREATE SYMMETRIC KEY key_dbKeys 
 WITH ALGORITHM = AES_128 
 ENCRYPTION BY CERTIFICATE cert_dbKeys; 

データを暗号化する

 OPEN SYMMETRIC KEY key_dbKeys 
 DECRYPTION BY CERTIFICATE cert_dbKeys WITH PASSWORD = 'abcd' 
 
(Retrieve and store Selected data with)
 EncryptByKey(Key_GUID ( 'key_dbKeys')、@clean_data); 
 
 SYMMETRIC KEYを閉じるkey_dbKeys; 

データを復号化する

SELECT DecryptByKeyAutoCert(cert_id( 'cert_dbKeys')、N'abcd '、table.data)FROM table 

この結果、nullの列が表示されます。

可能であれば、元のデータの代わりにNULL値を取得する理由、またはこのタスクを実行するためのより良い方法があるかどうかを判断できるように支援してください。

3
user3504079

これは、暗号化されたデータのkey_guidが、暗号化に使用される対称鍵のkey_guidと一致しない場合のように聞こえます。

データが対称キーを使用して暗号化され、varbinary列に保存される場合、最初の16バイトは、データの暗号化に使用される対称キーのKey_guidであり、DECRYPTBYKEYAUTOCERTは、正しい対称鍵を自動的に見つけることができます。

以下のスクリプトを実行して、これが事実であることを確認できますか?また、同じデータベースを使用してデータを暗号化および復号化しましたか?

select 
    name,cast(key_guid as varbinary(max))
from sys.symmetric_keys
where
    name ='key_dbKeys'

select distinct table.data from table
where 
    table.data is not null

問題の再現を試みた後、データを挿入する前に対称キーを開くときに問題が発生するか、DECRYPTBYKEYAUTOCERTのドキュメントを確認した後、戻り値(varbinary)をvarcharにキャストする必要があります。私はまた、あなたが開発したものに基づいた作業スクリプトを投稿しています。別のパスワードを使用する必要がありました。

declare  @clean_data varchar(100)

set  @clean_data='Hello World'

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssword!';

CREATE CERTIFICATE cert_dbKeys
   ENCRYPTION BY PASSWORD = 'P@ssword!'
   WITH SUBJECT = 'Database encryption key', 
   EXPIRY_DATE = '20201031';

CREATE SYMMETRIC KEY key_dbKeys 
   WITH ALGORITHM = AES_128
   ENCRYPTION BY CERTIFICATE cert_dbKeys;
create table EncryptedData
( secretmessage varbinary(max))

OPEN SYMMETRIC KEY key_dbKeys
DECRYPTION BY CERTIFICATE cert_dbKeys WITH PASSWORD = 'P@ssword!'

insert into EncryptedData (secretmessage) values(EncryptByKey(Key_GUID('key_dbKeys'), @clean_data))

CLOSE SYMMETRIC KEY key_dbKeys;

SELECT cast(DecryptByKeyAutoCert(cert_id('cert_dbKeys'), N'P@ssword!', secretmessage) as varchar(100)) FROM EncryptedData
2
Michael Keleher