SQL 服务器:始终加密

SQL Server: Always Encrypted

网上有很多帖子展示了这项技术的基础知识: 数据在任何地方都被加密,除了客户端, 列加密密钥 (CEK) 用于由客户端加密或解密数据。

  1. CEK存储在客户端机器上?在应用程序的连接字符串中?客户(=员工)可以看到它吗?例如,我们聘请了一位新秘书,他应该有权访问敏感(和加密)数据。我们给他一台新笔记本电脑,授予他 read/write 权限,在他的新笔记本电脑上安装应用程序,还有什么? "Telling" 他的CEK是什么?将 CEK 存储在注册表中的某个位置?

  2. 列主密钥 (CMK) 的作用是什么:创建新的 CEK 并在它们丢失的情况下恢复它们?只让一个授权人持有整个系统的钥匙?

列加密密钥 (CEK) 实际上与数据一起存储在 SQL 服务器中,但没有列主密钥 (CMK) 就无法使用。客户端应用程序需要解密数据的是 CMK。 CMK 可以存储在客户端计算机的 Windows 证书存储区或 Azure Key Vault 中。

如果您在 SSMS 中使用 "Encrypt Columns" 向导,那么它会为您生成两种类型的密钥。它会询问您要将 CMK 保存在哪里(Windows 证书存储或 Azure Key Vault),并让您选择是每个加密列有一个 CEK,还是所有列共享一个 CEK。它还允许您重用现有的 CMK(如果有的话)。

需要解密数据的应用程序需要访问 CMK(稍后会详细介绍)和连接字符串的以下添加:

Column Encryption Setting=Enabled;

如果需要,也可以通过编程方式更改此设置:

connStringBuilder.ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled;

应用程序如何访问 CMK 取决于它的存储位置:

  • 如果 CMK 存储在 Windows 证书存储中,则启用 Always Encrypted 的驱动程序将自动获取它(CEK 包含使用它所需的 CMK 的详细信息)。

  • 如果 CMK 存储在 Azure Key Vault 中,则需要 few changes 才能注册 Azure Key Vault 提供程序。

我没有使用过 Windows 证书存储,但我猜想您可以通过从现有计算机上的存储中导出 CMK 并导入它来为新计算机提供对加密列的访问权限进店买新的。