以前に暗号化されてテーブルに保存されたデータの復号化に問題があります。
対称キーを開き、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値を取得する理由、またはこのタスクを実行するためのより良い方法があるかどうかを判断できるように支援してください。
これは、暗号化されたデータの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