【SQL】【SQL Server】暗号化

基本編

DBに対して暗号化有効

http://msdn.microsoft.com/ja-jp/library/bb630389.aspx

構文

ALTER DATABASE 【データベース名】 SET ENCRYPTION ON;

USE testDataBase;
GO
ALTER DATABASE testDataBaseSET ENCRYPTION ON;
GO

マスタキーの作成

http://msdn.microsoft.com/ja-jp/library/ms174382.aspx

構文

CREATE MASTER KEY ENCRYPTION BY 
PASSWORD = 【パスワード】

/* マスタキーを作成 */
CREATE MASTER KEY ENCRYPTION BY 
PASSWORD = 'test_password'

マスタキーの削除

現在のデータベースからマスター キーを削除する
http://msdn.microsoft.com/ja-jp/library/ms180071.aspx

構文

DROP MASTER KEY

* マスタキーの存在を確認して、あれば削除
IF  EXISTS (SELECT * FROM sys.symmetric_keys WHERE [name] LIKE '%DatabaseMasterKey%')
	DROP MASTER KEY

例の参考資料

http://msdn.microsoft.com/ja-jp/library/bb326115.aspx

マスタキーのオープン

http://msdn.microsoft.com/ja-jp/library/ms174433.aspx

構文

OPEN MASTER KEY DECRYPTION BY
PASSWORD = 【パスワード】

/* マスタキーのオープン */
OPEN MASTER KEY DECRYPTION BY
PASSWORD = 'test_password'

マスタキーのクローズ

構文

CLOSE MASTER KEY

証明書作成

http://msdn.microsoft.com/ja-jp/library/ms187798.aspx

構文

CREATE CERTIFICATE 【証明書名】
  【パスワードなどのプロパティ指定】;

/* 証明書作成(期間は1年間) */
CREATE CERTIFICATE testCertificate01
WITH SUBJECT = 'testCertificate01',
START_DATE = '09/02/2010', EXPIRY_DATE = '09/02/2011';

証明書削除

http://msdn.microsoft.com/ja-jp/library/ms179906.aspx

構文

DROP CERTIFICATE 【証明書名】;

* 証明書「testCertificate01」の存在を確認して、あれば削除
IF  EXISTS (SELECT * FROM sys.certificates WHERE [name] = 'testCertificate01')
	DROP CERTIFICATE testCertificate01

対称キー作成

http://msdn.microsoft.com/ja-jp/library/ms188357%28v=SQL.90%29.aspx

構文

CREATE SYMMETRIC KEY 【キー名】
  【パスワードなどのプロパティ指定】;

CREATE SYMMETRIC KEY testKeyName01
    WITH ALGORITHM = AES_256
    ENCRYPTION BY CERTIFICATE testCertificate01;

対称キー削除

http://technet.microsoft.com/en-us/library/ms182698.aspx

構文

DROP SYMMETRIC 【キー名】REMOVE PROVIDER KEY

* 対称キー「testKeyName01」の存在を確認して、あれば削除
IF  EXISTS (SELECT * FROM sys.symmetric_keys WHERE [name] = 'testKeyName01')
	DROP SYMMETRIC testKeyName01 REMOVE PROVIDER KEY

対称キーのオープン

構文

OPEN SYMMETRIC KEY 【キー名】
 DECRYPTION BY 【パスワードなどのプロパティ指定】;

構文・参考資料

http://msdn.microsoft.com/ja-jp/library/ms190499%28SQL.90%29.aspx

* CERTIFICATE:対称キーの暗号化解除に使用する秘密キーを備えた、証明書testCertificate01を指定
OPEN SYMMETRIC KEY testKeyName01
 DECRYPTION BY CERTIFICATE testCertificate01;

対称キーのクローズ

構文

CLOSE SYMMETRIC KEY 【キー名】;

構文・参考資料

http://msdn.microsoft.com/ja-jp/library/ms177938.aspx

CLOSE SYMMETRIC KEY testKeyName01;

応用編

基本編を踏まえて、実際に使ってみる

データの一部を暗号化して追加

対称キーの GUID を Key_GUID 関数で取得して、EncryptByKey でデータを暗号化して INSERTする

/* 手順1:対称キーのオープン */
OPEN SYMMETRIC KEY testKeyName01 DECRYPTION BY CERTIFICATE testCertificate01;

/* 手順2:データ追加(testIdを暗号化) */
INSERT INTO testTable
(testId, testName, age) 
VALUES
(EncryptByKey(Key_GUID('testKeyName01'), N'001'), 'Mike', 23);

/* 手順3:対称キーのクローズ */
CLOSE SYMMETRIC KEY testKeyName01;

暗号化したデータを修正

基本的に追加した時と変わらず、追対称キーの GUID を Key_GUID 関数で取得して、EncryptByKey でデータを暗号化して UPDATEする

/* 手順1:対称キーのオープン */
OPEN SYMMETRIC KEY testKeyName01 DECRYPTION BY CERTIFICATE testCertificate01;

/* 手順2:データ修正(testIdを暗号化) */
UPDATE
testTable
SET
testId= EncryptByKey(Key_GUID('ENC_KEY_01'), N'012')
WHERE
age = 23

/* 手順3:対称キーのクローズ */
CLOSE SYMMETRIC KEY testKeyName01;

暗号化したデータの参照


/* 手順1:対称キーのオープン */
OPEN SYMMETRIC KEY testKeyName01 DECRYPTION BY CERTIFICATE testCertificate01;

/* 手順2:暗号化したデータの参照(testIdを暗号化解除) */
SELECT
CONVERT(NVarChar(MAX), DecryptByKey(testId)) AS testId
, testName
, age
FROM
testTable

/* 手順3:対称キーのクローズ */
CLOSE SYMMETRIC KEY testKeyName01;

参考資料

http://d.hatena.ne.jp/matu_tak/20091020/1256176938