SQL Server表数据实现安全加密

SQL Server表数据实现安全加密

什么是SQL Server表数据安全加密?

SQL Server表数据安全加密是对表数据进行加密,以保障敏感数据不会被未经授权的人员访问、窃取或篡改,从而提高数据安全性。

数据加密技术是一种安全保障手段,具有保护数据隐私和数据完整性的重要作用。因此,在应对当前信息安全形势,防范内外部安全威胁的过程中,加密技术被越来越多地应用到数据库中,其中包括SQL Server。

SQL Server表数据安全加密的方式

SQL Server表数据安全加密的方式有多种,主要有:

列级加密

行级加密

表级加密

列级加密

列级加密是对表的特定列进行加密,相对于行级和表级加密,列级加密更加灵活。加密后,该列的数据在存储到磁盘时会被加密,读取时会自动解密。具体实现可以使用SQL Server的内置加密函数。

--添加带有列级加密的列(使用Certificate Key加密)

ALTER TABLE dbo.MyTable

ADD MyEncryptedColumn varbinary(128),

MyNonceColumn varbinary(32),

MyEncryptedColumnAlgorithm varchar(10),

MyEncryptedColumnIV varbinary(16);

--进行列加密

OPEN MASTER KEY DECRYPTION BY PASSWORD = 'myStrongPassword';

CREATE CERTIFICATE MyTableCert ENCRYPTION BY PASSWORD = 'myStrongPassword';

ALTER TABLE dbo.MyTable

ADD MyEncryptedColumn varbinary(128),

MyNonceColumn varbinary(32),

MyEncryptedColumnAlgorithm varchar(10),

MyEncryptedColumnIV varbinary(16);

UPDATE dbo.MyTable

SET MyEncryptedColumn = EncryptByKey(Key_GUID('MyTableCert_Key'), MySensitiveColumn),

MyNonceColumn = EncryptByKey(Key_GUID('MyTableCert_Key'), CONVERT(varchar(20), MySensitiveColumn)),

MyEncryptedColumnAlgorithm = 'AES_256',

MyEncryptedColumnIV = EncryptByKey(Key_GUID('MyTableCert_Key'), CONVERT(varchar(20), NEWID()));

--解密

SELECT CONVERT(varchar(20),DecryptByKey(MyEncryptedColumn, 1, MyNonceColumn, MyEncryptedColumnAlgorithm, MyEncryptedColumnIV)) AS DecryptedValue

FROM MyTable;

行级加密

行级加密是对表的行进行加密。行级加密的方法主要分为两种:

Always Encrypted

Cell-Level加密

Always Encrypted

Always Encrypted是一种新的加密方案,可以在不泄露加密密钥的情况下,对敏感数据进行加密处理。该加密方案的主要优点是可以在应用程序层面对数据进行加密处理,因此即使攻击者可以获取到数据库的访问权限,在未知加密密钥的情况下也无法解密敏感数据。Always Encrypted使用了两个密钥:Column Encryption Key(CEK)和Column Master Key(CMK)。

Column Master Key(CMK)是用来保护Column Encryption Key(CEK)的一种密钥,存储在安全的兼容加密存储设备(如Azure Key Vault)中。而Column Encryption Key(CEK)则用于对表中的敏感列进行加密和解密,该密钥保存在客户端,并且不被数据库系统所知。通过这种方式,即使数据库管理员能够访问数据库存储的内容,他也不能查看其中的敏感数据。

Always Encrypted要求使用SQL Server 2016及更高版本,并且只支持部分数据类型。

Cell-Level加密

Cell-Level加密是一种基于列的加密技术,具有以下特点:

单元格级别的加密,数据需要在查询时解密

支持加密时指定明文,可对已有数据进行加密

只需要在列的定义中指定加密函数即可

Cell-Level加密可以使用SQL Server内置的加密函数进行实现。

--使用Cell-Level加密

CREATE CERTIFICATE MyCellLevelCert ENCRYPTION BY PASSWORD = 'myStrongPassword';

CREATE SYMMETRIC KEY MyCellLevelKey WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE MyCellLevelCert;

CREATE TABLE MyTable (

MyID INT PRIMARY KEY,

MySensitiveData VARBINARY(MAX) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = MyCellLevelKey, ENCRYPTION_TYPE = RANDOMIZED),

...

);

--解密

SELECT MyID, CONVERT(NVARCHAR(MAX), MySensitiveData) AS MyDecryptedData

FROM MyTable

WHERE MyID = 1;

表级加密

表级加密是对整个表进行加密,与列级和行级加密不同,表级加密是通过使用SQL Server的文件级加密功能实现的,因此其加密程度更高。

表级加密优势在于它可以轻松地将整个表加密,同时不需要对Existing application做任何更改。缺点是表级加密运行的开销可能会较大。例如,对于大型表,开启表级加密可能会降低查询性能,并增加查询计划的开销。另外,由于表级加密需要加密和解密整个表,因此会涉及到系统I/O和存储空间的开销。

表级加密可以在数据库中创建加密键,并使用该键加密和解密整个表。这种加密方式可以很好地保护数据,但由于加密和解密需要消耗很多系统资源,因此在设计表结构时需要特别注意。

--使用表级加密

USE MyDatabase;

CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE MyServerCert;

ALTER DATABASE MyDatabase SET ENCRYPTION ON;

总结

SQL Server表数据安全加密可以保障敏感数据不会被未经授权的人员访问、窃取或篡改,从而提高数据安全性。主要包括列级加密、行级加密和表级加密。

对于不同的加密需求,可以选择不同的加密方式来进行保护。

数据库标签