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表数据安全加密可以保障敏感数据不会被未经授权的人员访问、窃取或篡改,从而提高数据安全性。主要包括列级加密、行级加密和表级加密。
对于不同的加密需求,可以选择不同的加密方式来进行保护。