在第 3 步中,您提到您从数据库服务器导出证书,为确保最大安全性,切勿将您的证书存储在数据库服务器上。服务器不需要访问证书。
如果 SysAdmin 登录(SQL 身份验证)使用附加参数 Column Encryption Setting=Enabled 连接到 SSMS,则显示纯文本数据(预期加密数据)。我的理解是,除了应用程序用户之外,没有其他人应该看到纯文本数据)。谁能澄清一下?
如果 SysAdmin 从具有证书的客户端计算机连接到 SSMS,并且如果 SysAdmin 有权访问证书,那么他们将看到纯文本数据。
粗略地说,Always Encrypted 提供以下安全保证,纯文本数据将仅对有权访问 ColumnMasterKey(证书)的实体可见
为了详细说明,请考虑以下场景。
考虑两台机器:
- MachineA:运行 SQL Server 的机器
- MachineT:客户端机器。
考虑两个用户
UserA(这在技术上可以是一组用户,但为了简单起见,我将考虑使用单个用户的场景):谁是MachineA上的管理员,管理 SQL Server,并且是 SQL Server 上的 SysAdmin。但是,userA对MachineT没有任何类型的访问权限,并且UserA不应该能够解密存储在机器 A 上的 SQL Server 中的任何加密数据(加密数据,在此答案的上下文中是使用的 Always Encrypted 功能加密的数据SQL 服务器)。
UserT(这在技术上可以是一组用户,但为了简单起见,我将考虑使用单个用户的场景):是受信任的用户,可以访问MachineT ,可以访问托管在 SQL Server 上的数据库db中的所有数据机器A。此外,由于用户 T是受信任的,他/她应该能够解密加密数据。
考虑在MachineA上运行的 SQL Server具有数据库 db和表 t。
我们的目标是保护属于表t的列,例如ssnCol,这样只有userT应该能够以明文形式看到ssnCol。
可以使用以下步骤来实现上述目标。
- UserT登录到MachineT。
- UserT在MachineT中打开 SSMS 。
- UserT连接到MachineA上的 SQL Server
- UserT使用本文部分提到的步骤加密表 t 中的ssnCol
Encrypt columns (configure Always Encrypted)
- 在这一步之后,列ssnCol将被加密。
当userT以上述方式 加密ssnCol时,会生成两个密钥
- CMK:CMK 又名列主密钥是用于加密 CEK/s 的密钥。此密钥存储在MachineT的 Windows 证书存储中。
- CEK:CEK 又名列加密密钥是用于加密ssnCol的密钥,此密钥以加密形式存储在MachineA上的 SQL Server 中,并且不会以明文形式保存在任何地方。
因此,为了解密ssnCol,需要 CEK,然而,为了解密 CEK,需要 CMK。
由于 CMK 在 machineT 的 Windows 证书存储中,因此只有userT可以访问 CMK、解密 CEK 和解密ssnCol。
userA是machineA上的管理员,也是 SQL Server 上的 SysAdmin,但由于他/她无权访问 CMK,因此userA无法以明文形式访问ssnCol。您可以通过使用MachineA中的 SSMS 、以userA身份登录并查询ssnCol来验证这一点
如果您还有其他问题,请在评论部分提出,我可以回答。