SQLServer 数据加密解密:将 TDE 保护的数据库移到其他实例(二)

--	了解透明数据加密 (TDE)
--	https://technet.microsoft.com/zh-cn/library/bb934049(v=sql.105).aspx

“透明数据加密”(TDE) 可对数据和日志文件执行实时 I/O 加密和解密。
这种加密使用数据库加密密钥 (DEK),该密钥存储在数据库引导记录中以供恢复时使用。
数据库文件的加密在页级执行。已加密数据库中的页在写入磁盘之前会进行加密,在读入内存时会进行解密。

使用TDE操作步骤:
1. 创建主密钥
2. 创建或获取由主密钥保护的证书
3. 创建数据库加密密钥并通过此证书保护该密钥
4. 将数据库设置为使用加密

--	查询相关信息
select * from master.sys.key_encryptions
select * from master.sys.certificates
select * from sys.dm_database_encryption_keys where database_id=DB_ID('Temp')
select name,is_master_key_encrypted_by_server from sys.databases where is_master_key_encrypted_by_server=1

【测试一:分离和附加迁移】

use master;
go

--将相关信息删除
drop certificate  Mycertificate;
go
drop master key;
go  

--	创建数据库主密钥
create master key encryption by password = N'[email protected]';
go

--	创建以数据库主密钥加密的证书
create certificate Mycertificate with subject = 'Certificate to protect TDE key';
go

--	备份证书
backup certificate Mycertificate
to file = N'D:\mycertificate.cer'
with private key (
    file = N'D:\mycertificate_saleskey.pvk' ,
    encryption by password = N'[email protected]' );
go  

use [Temp];
go

--	创建用于以透明方式加密数据库的加密密钥
--	https://msdn.microsoft.com/zh-cn/library/bb677241(v=sql.105).aspx
create database encryption key
	with
	algorithm = aes_128
	encryption by server certificate Mycertificate;
go

--	启用数据库加密
--	https://msdn.microsoft.com/zh-cn/library/bb522682.aspx
alter database [Temp] set encryption on;
go

use master;
go

--	分离数据库
exec master.dbo.sp_detach_db @dbname = N'Temp';
go

--	移动数据文件到另一台服务器中:
--	另一台服务器实例中:
use master;
go

--	附加数据库(失败)
create database [Temp] on
( filename = N'C:\Database\Temp.mdf' ),
( filename = N'C:\Database\Temp_log.ldf' )
for attach ;
go

--	创建新的数据库主密钥
create master key encryption by password = N'[email protected]';
go

--	还原证书
create certificate Mycertificate
from file = N'C:\Software\mycertificate.cer'
with private key
(
    file = N'C:\Software\mycertificate_saleskey.pvk' ,
    decryption by password = N'[email protected]'
);
go

--	附加数据库(成功)
create database [Temp] on
( filename = N'C:\Database\Temp.mdf' ),
( filename = N'C:\Database\Temp_log.ldf' )
for attach ;
go

--	删除测试信息
use master;
go
drop certificate  Mycertificate;
go
drop master key;
go  

【测试二:备份和恢复迁移】

--	删除上次测试信息
use [Temp]
go
alter database [Temp] set encryption off;
go
drop database encryption key
go

use master;
go
drop certificate  Mycertificate;
go
drop master key;
go  

--	创建数据库主密钥
create master key encryption by password = N'[email protected]';
go

--	创建以数据库主密钥加密的证书
create certificate Mycertificate with subject = 'Certificate to protect TDE key';
go

--	备份证书
backup certificate Mycertificate
to file = N'D:\mycertificate.cer'
with private key (
    file = N'D:\mycertificate_saleskey.pvk' ,
    encryption by password = N'[email protected]' );
go  

use [Temp];
go

--	创建用于以透明方式加密数据库的加密密钥
create database encryption key
	with
	algorithm = aes_128
	encryption by server certificate Mycertificate;
go

--	启用数据库加密
alter database [Temp] set encryption on;
go

--	备份数据库
backup database [Temp] to disk = N'D:\Temp.bak'

--	拷贝mycertificate.cer、mycertificate_saleskey.pvk、Temp.bak到另一服务器
--	在另一台服务器实例中:

use master;
go

--	还原数据库(失败!)
RESTORE DATABASE [Temp]
FROM  DISK = N'C:\Software\Temp.bak'
WITH  FILE = 1,
MOVE N'Temp' TO N'C:\Database\Temp.mdf',
MOVE N'Temp_log' TO N'C:\Database\Temp_log.ldf',
NOUNLOAD,  STATS = 10
/*
消息 33111,级别 16,状态 3,第 1 行
找不到指纹为 '0xC1E2F607576904047A0D739588B65B27D8878B92' 的服务器 证书。
消息 3013,级别 16,状态 1,第 1 行
RESTORE DATABASE 正在异常终止。
*/

--	创建新的数据库主密钥
create master key encryption by password = N'[email protected]';
go

--	还原证书
create certificate Mycertificate
from file = N'C:\Software\mycertificate.cer'
with private key
(
    file = N'C:\Software\mycertificate_saleskey.pvk' ,
    decryption by password = N'[email protected]'
);
go

--	还原数据库(成功)
RESTORE DATABASE [Temp]
FROM  DISK = N'C:\Software\Temp.bak'
WITH  FILE = 1,
MOVE N'Temp' TO N'C:\Database\Temp.mdf',
MOVE N'Temp_log' TO N'C:\Database\Temp_log.ldf',
NOUNLOAD,  STATS = 10

--	删除数据库加密
use [Temp];
go
alter database [Temp] set encryption off;
go
drop database encryption key
go

更多参考:将 TDE 保护的数据库移到其他 SQL Server

时间: 2024-08-25 04:50:19

SQLServer 数据加密解密:将 TDE 保护的数据库移到其他实例(二)的相关文章

SQLServer 数据加密解密(一)

都是基本示例,更多参考官方文档: 1. Transact-SQL 函数 2. 数据库密钥 3. 证书 4. 非对称密钥 5. 对称密钥 -- drop table EnryptTest create table EnryptTest ( id int not null primary key, EnryptData nvarchar(20), ) insert into EnryptTest values(1,N'888888'),(2,N'888888'),(3,N'123456'),(4,N

SQLServer 数据加密解密:在多个服务器实例中创建相同对称密钥(三)

创建相同的对称密钥非常容易.使用相同的 KEY_SOURCE.ALGORITHM 和 IDENTITY_VALUE 密钥选项创建的对称密钥将是相同的. -- 创建测试 use [Temp] go -- drop table EnryptTest create table EnryptTest ( id int not null primary key, EnryptData nvarchar(20), ) go insert into EnryptTest values(1,N'888888')

[SQL Server] 利用透明数据加密(TDE)对整个数据库加密

using TDE encrypt SQL Database 前言 最近客户有需求想避免数据库(.mdf..ldf)被偷走时,数据外泄流出 刚好SQL Server的TDE加密功能满符合需求. TDE透明数据加密会对数据库整个加密,防范目标:有人已偷走数据库,没有凭证&私??的话,在附加数据库或还原备份数据库时就会报错,而没办法看到数据库里的数据. 一般程序存取数据,或用SSMS进入SQL Server里查询数据则是正常使用,无须额外设定 不过得留意Standard版的数据库不支持此功能 支持T

[转载]sqlserver、Mysql、Oracle三种数据库的优缺点总结

一.sqlserver优点:易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能.与许多其他服务器软件紧密关联的集成性.良好的性价比等:为数据管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应,从而获得竞争优势.从数据管理和分析角度看,将原始数据转化为商业智能和充分利用Web带来的机会非常重要.作为一个完备的数据库和数据分析包,SQLServer为快速开发新一代企业级商业应用程序.为企业赢得核心竞争优势打开了胜利之门.作为重要的基准测试可伸缩性和速度奖的记录保持者,SQLServ

SQLServer性能优化之 nolock,大幅提升数据库查询性能

公司数据库随着时间的增长,数据越来越多,查询速度也越来越慢.进数据库看了一下,几十万调的数据,查询起来确实很费时间. 要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑.其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能. 不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会造成Dirty Read,就是读到无效的数据.

JDBC连接SqlServer数据库(非默认实例)方法

一般我们在连接数据库的时候都是用的默认实例名,今天遇到了用非默认是实例名:连接代码如下(Java): URL=jdbc:microsoft:sqlserver://192.168.1.85//DEMO;DatabaseName=PePsiEasyData 说明: 192.168.1.85是数据库地址.不指定端口 //DEMO 指定实例名为DEMO 也可以写成这样: URL=jdbc:microsoft:sqlserver://192.168.1.85;instanceName=DEMO;Data

sqlserver、Mysql、Oracle三种数据库的优缺点总结

一.sqlserver 优点: 易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能.与许多其他服务器软件紧密关联的集成性.良好的性价比等; 为数据管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应,从而获得竞争优势.从数据管理和分析角度看,将原始数据转化为商业智能和充分利用Web带来的机会非常重要.作为一个完备的数据库和数据分析包,SQLServer为快速开发新一代企业级商业应用程序.为企业赢得核心竞争优势打开了胜利之门.作为重要的基准测试可伸缩性和速度奖的记录保持者,SQLS

sql2000数据库误删除后自行恢复二次覆盖成功恢复

sql2000数据库误删除后自行恢复二次覆盖成功恢复 [数据恢复故障描述] 今天接到一个客户电话,他的速达sql2000数据库,数据库误删除了,关键之前还没有备份过.他就想自己尝试恢复,使用网上下载的恢复工具恢复出一些数据之后,本来数据库在E盘,结果他又将恢复的数据保存在了E盘,造成了二次覆盖.结果数据库附加不上,他才意识到事情的严重性,联系到我们. 错误如图下图: [数据恢复解决方案] 工程师使用自主研发的数据库恢复软件,手工提取碎片,进行数据库碎片重组与恢复软件远程恢复成功! [数据库修复结

mysql数据库分区功能及实例详解

分区听起来怎么感觉是硬盘呀,对没错除了硬盘可以分区数据库现在也支持分区了,分区可以解决大数据量的处理问题,下面一起来看一个mysql数据库分区功能及实例详解 一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例.mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存