列加密密钥 (CEK) 实际上与数据一起存储在 SQL Server 中,但如果没有列主密钥 (CMK),它们就无法使用。它是客户端应用程序解密数据所需的 CMK。CMK 可以存储在客户端计算机的 Windows 证书存储中,也可以存储在 Azure Key Vault 中。
如果您在 SSMS 中使用“加密列”向导,那么它将为您生成两种类型的密钥。它会询问您要将 CMK(Windows 证书存储或 Azure Key Vault)保存在哪里,并让您选择是每个加密列都有一个 CEK,还是所有列共享一个 CEK。它还允许您重用现有的 CMK(如果有的话)。
然后,需要解密数据的应用程序需要访问 CMK(稍后会详细介绍)以及对连接字符串的以下添加:
Column Encryption Setting=Enabled;
如果需要,也可以通过编程方式更改此设置:
connStringBuilder.ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled;
应用程序如何访问 CMK 取决于它的存储位置:
我没有使用过 Windows 证书存储区,但我猜您可以通过从现有计算机上的存储区中导出 CMK 并将其导入新计算机上的存储区来让新计算机访问加密列。