本文解释了如何解密对称密钥。例如:
SELECT SK.name, SK.symmetric_key_id, SK.key_length, SK.algorithm_desc,
KE.crypt_type_desc,
COALESCE(C.name,AK.name,PSK.name) AS protector_name,
KE.crypt_property AS encrypted_key,
COALESCE(DECRYPTBYCERT(C.certificate_id,KE.crypt_property),
DECRYPTBYASYMKEY(AK.asymmetric_key_id,KE.crypt_property)) AS decrypted_key
FROM sys.key_encryptions AS KE
JOIN sys.symmetric_keys AS SK
ON KE.key_id = SK.symmetric_key_id
LEFT JOIN sys.certificates AS C
ON KE.thumbprint = C.thumbprint
LEFT JOIN sys.asymmetric_keys AS AK
ON KE.thumbprint = AK.thumbprint
LEFT JOIN sys.symmetric_keys AS PSK
ON KE.thumbprint = CAST(PSK.key_guid AS VARBINARY(50));
可以使用以下查询对其进行测试:
--
CREATE MASTER KEY ENCRYPTION
BY PASSWORD = 'smGK_MasterKeyPassword@';
--
CREATE CERTIFICATE [CERT_V001]
WITH SUBJECT = 'User for protecting SM symetric keys.'
--
CREATE SYMMETRIC KEY [SK_SecurityUsers_V001]
WITH ALGORITHM = AES_256 ENCRYPTION
BY CERTIFICATE [CERT_V001]
GO
DECLARE @Email NVARCHAR(128) = '[email protected]';
DECLARE @EmailEncrypted VARBINARY(256);
OPEN SYMMETRIC KEY [SK_SecurityUsers_V001] DECRYPTION
BY CERTIFICATE [CERT_V001];
SELECT @EmailEncrypted = ENCRYPTBYKEY(KEY_GUID('SK_SecurityUsers_V001'),@Email);
SELECT @EmailEncrypted;
CLOSE SYMMETRIC KEY [SK_SecurityUsers_V001];
OPEN SYMMETRIC KEY [SK_SecurityUsers_V001] DECRYPTION
BY CERTIFICATE [CERT_V001];
SELECT CONVERT(NVARCHAR(128), DECRYPTBYKEY(@EmailEncrypted));
CLOSE SYMMETRIC KEY [SK_SecurityUsers_V001];
--DROP SYMMETRIC KEY [SK_SecurityUsers_V001];
--DROP CERTIFICATE [CERT_V001];
--DROP MASTER KEY;
我想知道,这是否意味着数据根本不受保护?
文章中说:
但是,对于受密码保护和受对称密钥保护的密钥,这很遗憾地不起作用。
我想这意味着我需要使用其中一种加密类型来确保数据受到保护?
不,它受到保护,但如文章所示,您需要访问所有密钥才能解密这些值。当涉及到密钥的保护时,这篇文章采取了很多自由并掩盖了很多事情。尝试在不成为系统管理员、不知道 DMK 密码或使用透明解密层次结构的情况下执行此操作。你还能做吗?很可能不会。
SQL Server 中的机密信息通常受到加密级别的保护——一个密钥加密另一个密钥,另一个密钥加密另一个密钥。如果你能解开所有这些关卡(这篇文章甚至没有真正谈论,只是略作掩饰),那么你绝对可以解密数据。SQL Server 不使用任何自制加密,它是公开记录的所有行业标准算法。如果他们拥有所有的钥匙,就没有什么能阻止任何人实施一些事情来扭转它。这就是为什么过度配置权限是一件坏事。
在这种情况下,他们通常无法获得解密的数据。但是,有些边缘情况不会阻止具有管理访问权限和良好的加密工作知识的人获取数据。
这都是关于“合理保护”的,您已经为数据提供了足够合理的保护。如果您希望它非常安全,那么您需要使用另一个团队拥有的 HSM,并且会非常频繁地对其进行审核。没有人对服务器具有管理访问权限,也没有人对 SQL Server 具有系统管理员访问权限。那可能不会成功-因此“合理”的保护就足够了。