数据,尤其是机密数据的安全性,是我们设计和开发系统所要考虑的。SQL Server 2016引入了加密数据列的新方式,即始终加密(Always Encrypted)。有了始终加密,数据就可以通过ADO.NET在应用层进行加密,这意味着,在数据通过网络发送到SQL Server之前,你可以通过.NET应用程序来加密你的机密数据。这个过程中,网络传输的是密文,存储在DB里的数据也是密文,对我们的数据起到了一定程度的保护作用。下面看看如何使用这一功能(Framework4.6及其以上版本支持该功能)
1、新建列主密钥(Column Master Key)
2、 新建列加密密钥(Column Encryption Key)
3、新建测试表,注意这里指定了机密类型、算法及加密密钥。
-
CREATE TABLE [dbo].[Patients](
-
[PatientId] [int] IDENTITY(1,1),
-
[SSN] [nvarchar](11) COLLATE Latin1_General_BIN2
-
ENCRYPTED WITH (ENCRYPTION_TYPE = DETERMINISTIC,
-
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
-
COLUMN_ENCRYPTION_KEY = CEK1) NOT NULL,
-
[FirstName] [nvarchar](50) NULL,
-
[LastName] [nvarchar](50) NULL,
-
[MiddleName] [nvarchar](50) NULL,
-
[StreetAddress] [nvarchar](50) NULL,
-
[City] [nvarchar](50) NULL,
-
[ZipCode] [char](5) NULL,
-
[State] [char](2) NULL,
-
[BirthDate] [date]
-
ENCRYPTED WITH (ENCRYPTION_TYPE = RANDOMIZED,
-
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
-
COLUMN_ENCRYPTION_KEY = CEK1) NOT NULL
-
PRIMARY KEY CLUSTERED ([PatientId] ASC) ON [PRIMARY] )
4、新建SP,用于Insert数据
-
CREATE PROCEDURE Insert_Always_Encrypted (
-
@SSN NVARCHAR(11),
-
@FirstName varchar(50),
-
@LastName varchar(50),
-
@BirthDate date
-
)
-
AS
-
INSERT INTO dbo.Patients
-
(SSN, FirstName,LastName, BirthDate)
-
VALUES (@SSN,@FirstName,@LastName,@BirthDate);
5、导出服务器端的证书
6、在客户端导入该证书
7. 测试SP,直接在SSMS里执行是失败的
8、 准备测试的应用程式(注意这里的连接字符串里增加了选项:Column Encryption Setting = Enabled;)
最后附上C#测试源码:
(责任编辑:IT) |