本人新书上市,请多多关照:《SQL Server On Linux运维实战 2017版从入门到精通》
Always Encrypted,简称AE,官方翻译叫始终加密,下一节会介绍叫透明数据加密(TDE)的功能,如果搭配TDE连接SQL Server,那么数据在客户端和服务器上包含磁盘上的数据已经是被加密了的。但是还有一些不足的地方:1. 在内存中的数据页不被加密。2. 没有隔离密钥,SQL Server的管理员可以获取加密密钥和证书进行数据破解。基于大数据时代的数据安全性跟GDRP(General Data Protection Regulation)(它由欧盟推出,目的在于遏制个人信息被滥用,保护个人隐私。)的实行,数据的安全被推到非常高的程度。SQL Server在这方面也推出了各种功能来满足GDRP,其中一个就是AE。AE不仅解决了上面提到的两点不足,还实现了端对端的加密。
先来看第一个图,AE使用两类密钥来保护数据:
AE支持两种加密类型:
接下来做个快速演示,为了避免影响其他环节,这次创建一个专门的演示库:AEDemo。
这里选择默认的选项也就是当前用户,可以看到一共有四种可选,根据具体情况而定。
然后点击生成证书,可以看到证书信息,点击确定后再刷新SSMS的目录,新的列主密钥已经生成完毕。
即CEK,按下图方式打开并输入CEK名字,同时选择使用什么CMK来对其加密。前面提到,CMK是可以有多个的。
创建一个Patients
use AEDemo
GO
CREATE TABLE [dbo].[Patients](
[PatientId] [int] IDENTITY(1,1) NOT NULL,
[SSN] [nvarchar](11) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
[MiddleName] [nvarchar](50) NULL,
[StreetAddress] [nvarchar](50) NULL,
[City] [nvarchar](50) NULL,
[ZipCode] [int] NULL,
[State] [nvarchar](50) NULL,
[BirthDate] [datetime2](7) NOT NULL,
PRIMARY KEY CLUSTERED
(
[PatientId] ASC
) WITH (
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
插入测试数据
insert into [dbo].[Patients]
values(N'1097-22-14',N'abc',N'george',N'def',N'china',N'guangzhou',123456,N'guangdong','1900-01-01')
select * from [dbo].[Patients]
接下来开始使用密钥进行加密。选择加密列,如下图
选择需要加密的列及加密类型和密钥,这里可以选择已建好的CEK,或者由系统自动创建,不过系统创建的步骤较多,就不多演示,等后续有时间详细介绍的时候再演示,因为这个系列我想尽快介绍完SQL 2019的新功能。
选了已有的CEK后,后面的步骤就简单多了。
使用默认选项一直进行下去:
再次执行查询表的语句,可以看到已经加密成功
更多的资料可以访问官方博客:SQL Server Security Blog,我也会抽空翻译或者整合。
AE是非常重要且易用的功能,但是在本人研究过程发现AE实际上还有很多内容可以使用,正如上面官方博客,基于这个系列的初衷是介绍SQL on Linux 特别是2019为主,所以不打算前期过于深入。
AE从SQL Server 2016引入,跟平台无关,本文虽然是在Linux上操作,但是还没有深入演示如何在Linux上使用,由于时间关系,暂时不写出来,不过有兴趣的读者可以看一下国外的文章:SQL Server 2016: Always Encrypted