阐释对象加密和安全 enclave
除了支持静态加密外,SQL Server 还支持使用 Always Encrypted 对列中的数据进行加密。 加密数据后,访问数据库的应用程序必须具有正确的证书才能查看数据的纯文本值。
始终加密 (Always Encrypted)
Always Encrypted 允许对客户端应用程序中的数据进行加密,保护敏感数据免受恶意软件和高特权用户(例如数据库管理员 (DBA)、服务器管理员、云管理员或管理数据但不应具有访问权限的用户)的侵害。 此加密根据 Microsoft SQL Server 数据库中的设置自动发生,该数据库会将数据库列的加密设置告知应用程序。
下表提供了 Always Encrypted 用法的一些场景:
| 方案 | 定义 |
|---|---|
| 客户端和数据都在本地 | 对于需要保护本地数据库免受高特权用户(例如,管理 SQL Server 的外部供应商)侵害的情况。 |
| 客户端在本地,数据在 Azure 中 | 在这种情况下,为确保 Microsoft 云管理员无法访问数据,Always Encrypted 密钥存储在本地托管的密钥存储中,用于在 Microsoft Azure 上的虚拟机中运行的 SQL 数据库或 SQL Server。 |
| 客户端和数据都在 Azure 中 | 在这种情况下,环境完全托管在 Azure 上。 虽然 Always Encrypted 并未将数据与云管理员完全隔离开,但客户仍然受益于数据在数据库中加密的事实。 |
Always Encrypted 基于主加密密钥和列加密密钥。 同时拥有这两个密钥,可使用不同的加密密钥来加密每个列,以实现最大程度的数据保护。 Always Encrypted 具有各种密钥存储,可存储加密所使用的证书。
下面是启用 Always Encrypted 的示例。 可以看到 NationalIDNumber 和 BirthDate 列都是纯文本。
接下来的几个图像演示如何使用 Always Encrypted 加密这两个列。 加密可以使用 T-SQL 完成,但在此示例中,我们使用 SQL Server Management Studio 中的向导。 可以通过在对象资源管理器中右键单击表名称来访问该向导,如下所示。
选择 “加密列...”时,向导将启动。
选择“下一步”以选择要加密的列。
指定了两种不同类型的加密。 使用“确定性”加密来加密 NationalIDNumber 列,使用“随机”加密来加密 BirthDate 列。
随机加密比确定性加密更安全,但存在限制。 创建列后,无法更改其加密类型。 建议对具有一些已知非重复值的列使用随机加密,这些值可由有权访问加密数据的人猜测,例如三位数信用卡验证码。
使用随机加密的 Always Encrypted 受到限制,因为每次都以不同的方式加密相同的值。 这意味着你只能在结果中返回这些列。 相比之下,确定性加密始终以相同的方式对值进行编码,从而允许使用相等运算符和不相等运算符以及联接、分组和索引进行比较。
此外,向导会生成列加密密钥,用于执行数据加密。 每个加密列可以有自己的密钥,也可以对多个列使用相同的密钥。
确定要加密的列后,可以选择“下一步”,将显示“主密钥配置”屏幕:
在此屏幕中,你将创建用于加密列加密密钥的列主密钥。 如果使用 T-SQL 对列进行加密,可以提供自己的密钥。 此密钥必须存储在密钥存储中,例如 Windows 证书存储、Azure Key Vault 或硬件安全模块。 数据库引擎从不存储列主密钥,而仅包含有关存储位置的元数据。 不存储主密钥可防止对数据库具有完全访问权限的用户进行数据访问。
为了获得最高级别的安全性,密钥应存储在第三方密钥存储(如 Azure Key Vault)中。 请勿在承载数据库的服务器上生成密钥,因为可能有人会从该服务器上的内存中提取该密钥。
在此示例中,密钥存储在 Azure Key Vault 中。 在下一个屏幕上,向导将为你提供立即完成加密过程或生成 PowerShell 脚本的选项。 完成此过程后,对于没有密钥的查询者来说,数据将显示为加密状态。
若要从 Always Encrypted 列解密数据,应用程序需要 Always Encrypted 驱动程序才能连接到数据库,然后执行以下作:
- 应用程序可以访问存储 Always Encrypted 密钥的密钥存储
- 然后该应用程序检索数据
- 写回数据库的数据在客户端通过驱动程序加密
除驱动程序外,应用程序的连接字符串还需要提供“Column Encryption Setting=enabled”设置。 此设置会导致对应用程序使用的每个列进行元数据查找。
注意
为了最大程度地减少元数据查找,应用程序需要更新 .NET 应用程序内 SqlConnection 对象上的 SqlCommandColumnEncryptionSetting。 必须为应用程序提交的每个数据库查询进行这些设置。
安全 enclave
Always Encrypted 支持名为安全 enclave 的功能,该功能允许对加密数据进行更可靠的查询。
安全 enclave 是 SQL Server 进程中受保护的内存区域,它充当用于处理加密数据的受信任的执行环境。 此 enclave 对 SQL Server 显示为黑色的框,即使使用调试器也无法查看任何数据或代码。
此图显示了此过程的体系结构:
具有安全 enclave 的 Always Encrypted 还解决了“随机”加密的一些限制,从而允许对使用此加密类型的列进行模式匹配、比较操作和编制索引。