SQL Server 2016 データ暗号化
SQL Server 2016 の新機能「Always Encrypted」。
Always Encrypted (データベース エンジン) | Microsoft Docs
以下サイトで、どんなものか確認してみる。
SQL Server 2016 CTP 2.0 の Always Encrypted を使ってみる at SE の雑記
ということらしい。「Always Encrypted」の動作については、また後ほど確認してみるとして。
今のところは、いろいろと検討した結果、管理者側の機能としては、
顧客の「システム担当」が、対称キー作成時のパスワードを
ユーザー情報の登録/更新/参照の際(対称キーOpenの際)に入力した時に、
・ユーザー情報を暗号化して登録(更新)できる
・ユーザー情報を復号化して参照できる
といった動作にしていくことを予定。
なので「Always Encrypted」を使用しない方法でやってみる。
【1】対称キーの作成(アルゴリズムは AES_256 を指定)
CREATE SYMMETRIC KEY Beck_Sym_Key WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = '[SymKeyPassword]' go
【2】登録時の操作(暗号化)
(例)MST_USERテーブル(CREATE文)
暗号化する項目は[varbinary](max)型。
CREATE TABLE [dbo].[MST_USER]( [SystemUserID] [uniqueidentifier] NOT NULL, [UserID] [varbinary](max) NOT NULL, [LoginID] [varbinary](max) NOT NULL, [Password] [varbinary](max) NOT NULL, [LastName] [varbinary](max) NOT NULL, [FirstName] [varbinary](max) NOT NULL, [LastNameKana] [varbinary](max) NOT NULL, [FirstNameKana] [varbinary](max) NOT NULL, [MailAddress1] [varbinary](max) NOT NULL, [MailAddress2] [varbinary](max) NULL, CONSTRAINT [PK_MST_USER] PRIMARY KEY CLUSTERED ( [SystemUserID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO
(1)対称キーをオープンする。対称キーの GUID を Key_GUID 関数で取得して、
EncryptByKeyでデータを暗号化して INSERT する。
OPEN SYMMETRIC KEY Beck_Sym_Key DECRYPTION BY PASSWORD = '[SymKeyPassword]' go DECLARE @kGuid UNIQUEIDENTIFIER SET @kGuid = Key_GUID('Beck_Sym_Key') INSERT INTO MST_USER ( [SystemUserID], [UserID], [LoginID], [Password], [LastName], [FirstName], [LastNameKana], [FirstNameKana], [MailAddress1], [MailAddress2] )VALUES( NEWID(), EncryptByKey(@kGuid, "[UserID]", EncryptByKey(@kGuid, "[LoginID]", EncryptByKey(@kGuid, "[Password]", EncryptByKey(@kGuid, "[LastName]", EncryptByKey(@kGuid, "[FirstName]", EncryptByKey(@kGuid, "[LastNameKana]", EncryptByKey(@kGuid, "[FirstNameKana]", EncryptByKey(@kGuid, "[MailAddress1]", EncryptByKey(@kGuid, "[MailAddress2]" )
(2)対称キーの CLOSE
CLOSE SYMMETRIC KEY Beck_Sym_Key go
(参考)SELECT文を実行するとデータが暗号化されていることを確認できる。
SELECT * FROM MST_USER
【3】参照時の操作(復号化)
(1)SELECT文を実行(DecryptByKey で復号化)
対称キーをOPENして、SELECT文を実行。DecryptByKeyでデータを復号化する。
OPEN SYMMETRIC KEY Beck_Sym_Key DECRYPTION BY PASSWORD = '[SymKeyPassword]' SELECT TOP 1000 [SystemUserID] ,CONVERT(varchar, DecryptByKey([UserID])) AS [UserID] ,CONVERT(varchar, DecryptByKey([LoginID])) AS [LoginID] ,CONVERT(varchar, DecryptByKey([Password])) AS [Password] ,CONVERT(varchar, DecryptByKey([LastName])) AS [LastName] ,CONVERT(varchar, DecryptByKey([FirstName])) AS [FirstName] ,CONVERT(varchar, DecryptByKey([LastNameKana])) AS [LastNameKana] ,CONVERT(varchar, DecryptByKey([FirstNameKana])) AS [FirstNameKana] ,CONVERT(varchar, DecryptByKey([MailAddress1])) AS [MailAddress1] ,CONVERT(varchar, DecryptByKey([MailAddress2])) AS [MailAddress2] FROM [ProjectManagementSystem].[dbo].[MST_USER]
(2)対称キーの CLOSE
CLOSE SYMMETRIC KEY Beck_Sym_Key
(参考)SELECT文を実行して復号化されたデータを参照。
※対称キーをDROPする場合
DROP SYMMETRIC KEY Beck_Sym_Key
【4】ユーザ登録を行うプロシージャのサンプル
CREATE PROCEDURE [dbo].[RegistUser] @SymKeyPassword varchar(250), @UserID varchar(250), @LoginID varchar(250) , @Password varchar(max) , @LastName varchar(max) , @FirstName varchar(max) , @LastNameKana varchar(max) , @FirstNameKana varchar(max) , @MailAddress1 varchar(max), @MailAddress2 varchar(max) AS BEGIN DECLARE @OpenCmd nvarchar(MAX) SET @OpenCmd =N'OPEN SYMMETRIC KEY Beck_Sym_Key DECRYPTION BY PASSWORD = ''' + @SymKeyPassword + ''' ' EXECUTE sp_ExecuteSql @OpenCmd DECLARE @kGuid UNIQUEIDENTIFIER SET @kGuid = Key_GUID('Beck_Sym_Key') INSERT INTO MST_USER ( [SystemUserID], [UserID], [LoginID], [Password], [LastName], [FirstName], [LastNameKana], [FirstNameKana], [MailAddress1], [MailAddress2] )VALUES( NEWID(), EncryptByKey(@kGuid, @UserID), EncryptByKey(@kGuid, @LoginID), EncryptByKey(@kGuid, @Password), EncryptByKey(@kGuid, @LastName), EncryptByKey(@kGuid, @FirstName), EncryptByKey(@kGuid, @LastNameKana), EncryptByKey(@kGuid, @FirstNameKana), EncryptByKey(@kGuid, @MailAddress1), EncryptByKey(@kGuid, @MailAddress2) ) CLOSE SYMMETRIC KEY Beck_Sym_Key END