对于包含敏感数据的库,要实现备份加密。即备份文件别人拿到也不能还原和查看其中的数据
想到tde(transparent data encryption)。
tde msdn 说明:
“透明数据加密”(tde) 可对数据和日志文件执行实时 i/o 加密和解密。这种加密使用数据库加密密钥 (dek),该密钥存储在数据库引导记录中以供恢复时使用。dek 是使用存储在服务器的 master 数据库中的证书保护的对称密钥,或者是由 ekm 模块保护的非对称密钥。tde 保护“处于休眠状态”的数据,即数据和日志文件。它提供了遵从许多法律、法规和各个行业建立的准则的能力。软件开发人员籍此可以使用 aes 和 3des 加密算法来加密数据,且无需更改现有的应用程序。
其实吸引我的是“无需更改现有的应用程序”,因为我需要加密的库服务于一个非常稳定的系统,而且这样做所有事情dba可控。
tde加密体系结构:
测试过程:
代码如下:
--创建主密钥(master key)
use master
go
--drop master key
create master key encryption by password=n'1qaz@wsx';
go
--备份主密钥
backup master key to file=n'c:\master_key.cer'
encryption by password=n'!qaz2wsx'
go
--创建基于主密钥的证书。用于保护数据库加密密钥(database encryption key)
--drop certificate sdb_cert
create certificate sdb_cert
with subject=n'certificate for secretdb'
go
--使用私钥加密的方式备份主密钥的证书
backup certificate sdb_cert
to file=n'c:\sdb_cert.cer'
with private key
(
file =n'c:\sdb_cert.pvk',
encryption by password='!qaz2wsx'
)
go
--创建测试库secretdb
use master
go
create database secretdb
go
use secretdb
go
create table sdb_tb
(id int,val nvarchar(20));
insert into sdb_tb
values (1,n'a'),(2,n'b'),(3,n'c');
go
use secretdb
go
--创建数据库加密密钥
create database encryption key
with algorithm=aes_128
encryption by server certificate sdb_cert;
go
--启用数据库加密
use secretdb
go
alter database secretdb set encryption on
go
--备份secretdb,用于后续的异机还原测试
use master
go
backup database secretdb to disk=n'd:\secretdb.bak'
go
在完成这些后,secretdb库已经加密,并且得到其加密后的备份文件,接下来需要在另台还原这个备份。
我把secretdb.bak,sdb_cert.cer,sdb_cert.pvk拷到别一台机。直接还原的话,会报错。需要创建原来用于加密的证书来还原数据库备份。我的目的达到了!
--在异机上恢复secretdb的备份
use master
go
create database secretdb
go
restore database secretdb
from disk=n'd:\secretdb.bak'
with replace
go
--消息 33111,级别 16,状态 3,第 1 行
--找不到指纹为 '0x0106000000000009010000009c529ffd5c7fd72fd0aae9edf46c5f69946ffed0' 的服务器 证书。
--消息 3013,级别 16,状态 1,第 1 行
--restore database 正在异常终止。
创建证书并还原。
use master
go
create certificate sdb_cert
from file=n'c:\sdb_cert.cer'
with private key
(
file=n'c:\sdb_cert.pvk',
decryption by password=n'!qaz2wsx'
)
go
restore database secretdb
from disk=n'd:\secretdb.bak'
with replace
go
总结:
其实在做tde前应该仔细阅读bol的说明:ms-help://ms.sqlcc.v10/ms.sqlsvr.v10.zh-chs/s10de_4deptrbl/html/c75d0d4b-4008-4e71-9a9d-cee2a566bd3b.htm
其中说到:
如果使用 tde 对数据库进行加密,备份压缩将无法显著压缩备份存储。
复制不会以加密形式从启用了 tde 的数据库中自动复制数据。如果您想保护分发和订阅服务器数据库,则必须单独启用 tde。
某些限制和注意事项,会影响tde的部署和使用。