了解 SQL Server 加密(通过密码)?

Roy*_*mir 4 sql-server-2008 security sql-server

问完这个我还有一个问题。

公司需要存储敏感数据。请我们现在不要谈论证书。

一个DBA执行以下操作:

  CREATE SYMMETRIC KEY SecureSymmetricKey1 
  WITH ALGORITHM = DESX
  ENCRYPTION BY PASSWORD = N'blabla';
Run Code Online (Sandbox Code Playgroud)

一个程序员想要加密数据并执行以下操作:

  -- 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');
Run Code Online (Sandbox Code Playgroud)

另一个程序员想要读取数据,所以他这样做:

  DECLARE @decrypted_str VARBINARY(MAX)
  SET @decrypted_str = DecryptByKey(...encrypted_str...) 
Run Code Online (Sandbox Code Playgroud)

一切都很好。

问题 :

  1. 当程序员打开对称密钥时,他必须知道密码。我不认为程序员应该知道密码。如何解决?

  2. 如果一个 GOD 黑客得到了整个.BAK文件并将备份恢复到他自己的机器上 - 他可以查看其中一个程序员编写的存储过程源,并查看密码。然后黑客可以做:

    开放对称密钥 SecureSymmetricKey1 密码解密 = N'blabla'

我错过了什么?

谢谢你的帮助。

Rem*_*anu 8

实际上只有两种选择:

  1. 自动密钥解密即。密钥层次结构包括服务主密钥的加密(通常通过数据库主密钥),引擎能够在需要时解密和/或加密数据。这可以防止媒体意外丢失,但任何有权访问正在运行的服务器的人都可以访问加密数据(受访问权限的约束,不受加密保护的约束)。透明数据加密 TDE 是此类访问的高端版本。

  2. 显式会话提供的解密密钥应用程序必须向用户询问密钥解密密码,并在它使用的每个会话中显式打开密钥。引擎本身无法解密数据。这可以防止通过加密方式对数据进行任何未经授权的访问(即使一个人可以访问引擎并有权读取数据,他也无法在不知道密码的情况下使用数据)。毋庸置疑,让应用程序提示用户输入密码在桌面应用程序中充其量是令人讨厌的,而在网络应用程序中则完全不可能(网络应用程序需要存储密码以在请求之间使用它,这是一个大问题)。

这些是唯一的选择。永远不需要将密码存储在任何配置文件或存储过程中。任何需要在某处存储访问密码的方案从一开始就注定失败,您需要回滚到设计的第一页并从头开始。