为了帮助包含数据库的安全,可以采取以下预防措施:
- 设计安全的系统。
- 对机密资产加密。
- 在数据库服务器外围构建防火墙。
但是恶意方如果窃取了驱动器或备份磁带等物理介质,就可以还原或附加数据库并浏览其数据。
一种解决方案是加密数据库中的敏感数据,并使用证书保护用于加密数据的密钥。此解决方案可以防止没有密钥的人使用这些数据。但必须提前规划好此类保护。
TDE的主要作用是防止数据库备份或数据库文件被非法获取之后,没有数据加密密码的情况下无法恢复或附加数据库。
USE [master];
GO
1、查看master数据库是否被加密
SELECT name,is_master_key_encrypted_by_server FROM
sys.databases;
2、创建master数据库下的主数据库密钥
USE master
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = N'123456';
--drop master key --删除主密钥
OPEN MASTER KEY DECRYPTION BY PASSWORD='123456'
3、查看master数据库下的密钥信息
SELECT * FROM sys.symmetric_keys;
4、创建证书用来保护 数据库加密密钥 (DEK)
CREATE CERTIFICATE MyCertificate WITH SUBJECT = N'ENCRYPTION CERTIFICATE' ,EXPIRY_DATE='2999-12-31'
--DROP CERTIFICATE MyCertificate 删除证书
--SELECT * FROM sys.certificates 查询证书信息
5、创建由MyCertificate保护的DEK 数据库加密密钥 (对称密钥)
USE [要加密的数据库名称]
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128
ENCRYPTION BY SERVER CERTIFICATE MyCertificate;
6、备份证书和主密钥
USE master;
GO
BACKUP CERTIFICATE MyCertificate TO FILE='d:\MSSQL\MyCertificate'
WITH PRIVATE KEY(FILE ='d:\MSSQL\privatekey.pvk' ,
ENCRYPTION BY PASSWORD='123456'
)
BACKUP MASTER KEY TO FILE = 'd:\MSSQL\master.cer'
ENCRYPTION BY PASSWORD = '123456';
GO
7、对相应的数据库做加密处理
--生产环境下,设置成单用户在运行加密
ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
--备份成功以后,开启TDE 加密
ALTER DATABASE dbname SET ENCRYPTION ON;
GO
--设置多用户访问
ALTER DATABASE dbname SET MULTI_USER WITH ROLLBACK IMMEDIATE;
GO
8、检查数据库是否成功加密.
SELECT DB_NAME(database_id),encryption_state FROM sys.dm_database_encryption_keys;
0 = 不存在数据库加密密钥,未加密
1 = 未加密
2 = 正在进行加密
3 = 已加密
4 = 正在更改密钥
5 = 正在进行解密
6 = 正在进行保护更改(正在更改对数据库加密密钥进行加密的证书或非对称密钥)。
--在其他服务器附加加密后的数据库文件
1、先在他服务器还原了MASTER KEY (将上面在备份拷贝至到其他服务器)
USE master;
RESTORE MASTER KEY
FROM FILE = 'd:\MSSQL\master.cer'
DECRYPTION BY PASSWORD = 'AdM&*2019%$12l5'
ENCRYPTION BY PASSWORD = 'AdM&*2019%$12l5';
GO
2、打开主密钥
USE master
GO
OPEN MASTER KEY DECRYPTION BY PASSWORD=N'AdM&*2019%$12l5';
3、创建证书
USE master
GO
CREATE CERTIFICATE MyCertificate
FROM FILE = 'd:\MSSQL\MyCertificate'
WITH PRIVATE KEY (FILE = 'd:\MSSQL\privatekey.pvk' ,
DECRYPTION BY PASSWORD = 'AdM&*2019%$12l5');
GO
4、将数据库文件拷贝到其他服务器,然后附加数据库。
CREATE DATABASE dbname
ON PRIMARY
(
FILENAME=N'D:\dbname .mdf'
)
LOG ON
(
FILENAME=N'D:\dbname .ldf'
)
FOR ATTACH ;
GO
如果在其他服务器上没有对应的主密钥和证书,进行还原的时候会出现下面的错误:

如果在其他服务器上没有对应的主密钥和证书,进行附加的时候会出现下面的错误:





