[英]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.