问完这个我还有一个问题。
一家公司需要存储敏感数据。请让我们现在不要谈论证书。
DBA执行以下操作:
CREATE SYMMETRIC KEY SecureSymmetricKey1
WITH ALGORITHM = DESX
ENCRYPTION BY PASSWORD = N'blabla';
程序员想要加密数据并执行以下操作:
-- open key
OPEN SYMMETRIC KEY SecureSymmetricKey1
DECRYPTION BY PASSWORD = N'blabla'
-- actual encrpyt
DECLARE @encrypted_str VARBINARY(MAX)
SET @encrypted_str = EncryptByKey(Key_GUID('SecureSymmetricKey1'),'my data');
另一个程序员想要读取数据,所以他这样做了:
DECLARE @decrypted_str VARBINARY(MAX)
SET @decrypted_str = DecryptByKey(...encrypted_str...)
一切都好。
问题 :
当程序员打开对称密钥时,他必须知道密码。我认为程序员不应该知道密码。如何解决?
如果 GOD 黑客获得了整个
.BAK
文件并将备份恢复到自己的机器上 - 他可以查看其中一位程序员编写的存储过程源,并查看密码。然后黑客可以做:打开对称密钥 SecureSymmetricKey1 密码解密 = N'blabla'
我错过了什么?
感谢您的帮助。
实际上只有两种选择:
自动密钥解密即。密钥层次结构包括由服务主密钥(通常通过数据库主密钥)进行的加密,并且引擎能够在需要时解密和/或加密数据。这可以防止媒体意外丢失,但任何有权访问正在运行的服务器的人都可以访问加密数据(受访问权限限制,不受加密保护)。透明数据加密 TDE 是此类访问的高端版本。
显式会话提供解密密钥应用程序必须要求用户提供密钥解密密码,并在其使用的每个会话中显式打开密钥。引擎本身无法解密数据。这可以防止通过加密方式对数据进行任何未经授权的访问(即使一个人可以访问引擎并具有读取数据的访问权限,他也无法在不知道密码的情况下使用数据)。不用说让应用程序提示用户输入密码在桌面应用程序中充其量是烦人的,而在网络应用程序中则完全不可能(网络应用程序需要存储密码才能在请求之间使用它,这是一个大问题)。
这些是唯一的选择。永远不需要将密码存储在任何配置文件或存储过程中。任何需要将访问密码存储在某处的方案从一开始就注定要失败,您需要回滚到设计的第一页并从头开始。