2016-11-09 11 views
9

SQL Server 2008/2012を使用しています。データベースに暗号化された列が含まれています。暗号化された列名をSQL Serverの暗号化キーと証明書で取得する

がマスターキー

CREATE MASTER KEY ENCRYPTION BY 
PASSWORD = '[email protected]' 
GO 

対称鍵を作成し、CERTIFICATE

を設定する例テーブル

CREATE TABLE [HR].[Employees](
     [EmployeeID]  [int]   NOT NULL, 
     [EmployeeName] [varchar](50) NULL, 
     [SSN]    [varchar](20) NOT NULL, 
     [EncryptedSSN] [varbinary] (200) NULL, 
CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED 
( [EmployeeID] ASC) 
) 
GO 

を作成します - 列は、次のクエリを使用して暗号化されています

CREATE CERTIFICATE TestCert WITH SUBJECT = 'SSN Encryption'; GO CREATE SYMMETRIC KEY HRKey WITH ALGORITHM = DES ENCRYPTION BY CERTIFICATE TestCert; GO 

暗号化データ

OPEN SYMMETRIC KEY HRKey 
    DECRYPTION BY CERTIFICATE TestCert; 
Now we can update the EncryptedSSN column of our Employees table. 

UPDATE [HR].[Employees] 
    SET [EncryptedSSN] = EncryptByKey(Key_GUID('HRKey'), SSN); 
GO 

私はクエリを使用してこのデータを復号化しています - ここで

OPEN SYMMETRIC KEY HRKey 
    DECRYPTION BY CERTIFICATE TestCert; 
SELECT [SSN], 
    CONVERT(VARCHAR, DecryptByKey([EncryptedSSN])) 
    AS 'Decrypted SSN' 
    FROM [HR].[Employees] 
GO 

我々は、ハードコードの鍵/証明書の値を与えます。

私はこのクエリでそのテーブルで暗号化された列名を取得しています -

SELECT stab.name Table_Name, sc.name Column_Name FROM sys.columns sc 
     INNER JOIN sys.types st ON sc.system_type_id=st.system_type_id 
     INNER JOIN sys.tables stab ON stab.object_id=sc.object_id 
     WHERE st.name='varbinary' 
     AND stab.is_ms_shipped=0 

そして、このクエリによるキーと証明書リスト -

SELECT name, key_length, algorithm_desc, create_date, modify_date 
FROM sys.symmetric_keys; 
SELECT name, subject, start_date, expiry_date 
FROM sys.certificates 

今、私が/どのキーを取得したいです証明書はどの暗号化された列に属していますか?ハードコーディングされた値を与えずにその列に対して復号化を適用できます。助けてください....

答えて

2

と私は解決策を見つけてみてください -

SELECT DISTINCT key_name(encryptedcol) FROM encryptedTable; 

このクエリは、その列に属している暗号化キーを発生できます。

1

T-SQL組み込みのシステム関数とビューを使用することはできません。

また、列のタイプはvarbinaryであり、データを暗号化する必要はありません。

動的なT-SQLステートメントを作成し、証明書とキーをハードコードしないようにする場合は、mappingテーブルを作成できます。例えば、このような何か:

TableName 
ColumnName 
Certificate 
EncryptionKey 
IsSymmetric 

は、これは完璧な回避策(はい、あなたはデータを維持する必要があります)ではありませんが、新しい列は常に暗号化されていない場合には、仕事をすることがあります。検索後

関連する問題