无论是公司政策、行业还是政府法规,都有可能要求使用加密措施来保护存储在数据库中的敏感数据数据库。为了帮助满足这些法规要求,SQLServer数据加密功能提供了多个选项,用于在数据通过网络传输、备份或保存到服务器或网络时对数据进行加密。 SQLServer数据加密选项包括:透明数据加密、列级加密、SQLServer对象定义加密、备份加密、SQLServer连接加密以及使用BitLocker驱动程序加密实现的WindowsEFS数据库文件级加密。这些数据加密方案在数据库和操作系统层面为数据提供强大的安全支持,有效防止机密信息未经授权泄露的可能性,即使SQLServer基础设施和数据库本身遭到破坏。 使用上述SQLServer数据加密方式的缺点是不能直接访问加密数据或修改这些数据。要对加密数据执行操作,必须首先对其进行解密,这意味着数据无法在其整个生命周期内保持加密状态。 为了解决这个问题,微软在SQLServer2016中引入了AlwaysEncrypted(全加密技术)。 什么是AlwaysEncrypted? AlwaysEncrypted选项使用增强的ADO.NET客户端库和密文来加密和解密数据。借助AlwaysEncrypted,数据始终处于加密状态,您无需先解密即可对加密数据执行操作。这意味着如果使用此功能,加密的敏感信息就没有机会变成明文。很明显,这个特性不同于SQLServer的其他数据加密特性,它可以确保你的数据始终保持加密状态,无论数据是在使用中还是处于静止状态。 另外,数据加解密都是在应用后台实现的,减少了更改现有应用的工作量。没有其他关系数据库管理系统可以提供类似于AlwaysEncrypted的功能。 AlwaysEncrypted使用两种类型的密钥:列加密密钥(CEK)和列主密钥(CMKS)。列加密密钥用于加密存储在数据库列中的敏感数据,列主密钥用于存储列加密密钥。我们应该在创建CEK之前创建CMK。我们可以用一个CEK加密所有的列值。有关CMK和CEK的信息存储在数据库系统的分类视图中。您应该将CEK备份到网络上安全可靠的位置。 如何配置AlwaysEncrypted安全功能? 为了演示方便,这里我在我本地的SQLServer实例中使用“OUTLANDER”数据库。 第一步:创建列主密钥(columnmasterkey) 使用SQLServer2016对象管理器,打开数据库文件夹,选择要配置AlwaysEncrypted的数据库。然后,打开Security文件夹并找到AlwaysEncryptedKeys文件夹。右击“ColumnMasterKeyDefinitions”文件夹,然后单击“NewColumnMasterKeyDefinition”打开“NewColumnMasterKeyDefinition”对话框(见图1)。 图1:新建列主密钥定义对话框 在“名称”文本框中,输入新建CMK的名称。然后为包含CMK的密钥库指定密钥库提供程序,如图1所示。对于CMK,最好的选择是使用存储在本地证书库中的证书。比如我点击了“GenerateSelf-SignedCertificate”按钮生成了一个自签名证书,然后把生成的证书放到了我的个人存储中。***单击“确定”按钮以在数据库中创建CMK。 第二步:创建列加密密钥(columnencryptionkey) 在“AlwaysEncryptedKeys”文件夹中,右击“ColumnEncryptionKeys”文件夹,点击NewColumnEncryptionKey。将弹出新列加密密钥对话框。 图2:NewColumnEncryptionKey对话框 在“Name”文本框中输入新建CEK的名称,并定义其对应的CMK,如图2所示,点击“OK”按钮创建一个新的CEK。 步骤三:创建包含加密列的表 在SSMS2014的查询编辑器中,输入建表脚本“CREATETABLE”T-SQL语句,如图3所示。该语句将创建“dbo.Contact_AlwaysEncryptedDemo"表,其中包含加密列。 需要注意的是,使用确定性加密的列支持等号查找、连接和分组操作,而使用随机加密的列不支持这些操作。 图3:T-SQL建表语句
