簡體   English   中英

在 sql server 中使用加密密鑰和證書獲取加密列名

[英]Get encrypted column name with their encryption key and certificate in sql server

我正在使用 SQL Server 2008/2012。在我的數據庫中,我有一個包含加密列的表。 該列使用以下查詢進行加密 -

創建示例表

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 MASTER KEY ENCRYPTION BY 
PASSWORD = 'T3stP@ssword'
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

現在我想知道哪個密鑰/證書屬於哪個加密列,這樣我就可以在不提供硬編碼值的情況下對該列應用解密。 請幫幫我....

經過搜索和嘗試,我找到了解決方案 -

SELECT DISTINCT key_name(encryptedcol) FROM encryptedTable;

此查詢為結果提供屬於該列的加密密鑰。

我正在使用 SQL Server 2016 。

下面是使用密鑰獲取所有必需加密列的查詢。

SELECT t.name AS TableName
    ,c.name AS ColumnName
    ,c.max_length
    ,k.name AS KeyName
    ,c.encryption_type_desc
    ,c.encryption_algorithm_name
FROM sys.columns c
INNER JOIN sys.column_encryption_keys k ON c.column_encryption_key_id = k.column_encryption_key_id
INNER JOIN sys.tables t ON c.object_id = t.object_id
WHERE encryption_type IS NOT NULL    

您不能,至少不能使用 T-SQL 內置系統函數和視圖。

此外,列的類型可以是varbinary並且其中的數據不需要加密。

如果要構建動態 T-SQL 語句並避免證書和密鑰硬編碼,則可以創建mapping表。 例如,這樣的事情:

TableName
ColumnName
Certificate
EncryptionKey
IsSymmetric

這不是完美的解決方法(是的,您需要維護數據),但如果新列沒有經常加密,它可能會完成這項工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM