原文:对 sql server 数据库的备份进行加密

嗯,最近在研究数据库备份相关的东西,考虑到应该为数据库备份加个密,就准备从网上搜索一下看看有什么好办法,没想到还挺乱。。。

首先,我从网上搜到的,对数据库备份加密的方法,主要有三种:

 

1、在使用 BACKUP 语句时,添加 PASSWORD 参数【此方法适用于 sql server 2012 以前的版本(不包含 2012)】

不过呢,其实这个 PASSWORD 参数的加密,并不是我们想象中的对数据完整的加密。

根据 MSDN 中的介绍:https://msdn.microsoft.com/zh-cn/library/ms186865(v=sql.100).aspx

貌似此密码仅仅是给备份附加了一个密码,并没有对备份数据加密,如果该密码直接被修改替换,备份中的数据仍然可以被正确的读取,所以,其实加密的意义不是很大。

 

2、对数据库启用 透明数据加密(TDE)【此方法适用于 sql server 2008 及以后的版本(含2008)】

注:仅 sql server enterprise(企业版)支持此功能。

这个TDE吧,嗯,非常的好,因为它不仅仅是对备份加密,它是对整个数据库进行了加密,而且既然是“透明”,也就是说不会影响到任何对数据库的操作,正常的对数据库操作(增删改查什么的),还有备份恢复什么的,都不需要特别的考虑加密问题。只有离开了当前的数据库服务器,就会发现,什么都做不了。需要在新的服务器中导入原来的加密证书即可正常使用。

MSDN 相关文档:https://msdn.microsoft.com/zh-cn/library/bb934049.aspx

 

要启用透明加密,需要以下几个步骤:

1、在 master 数据库中,添加 数据库主密钥:

更多:https://msdn.microsoft.com/zh-cn/library/ms174382.aspx

USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '$$test$$';

其中,Password = '' 这里就是在设置主密钥,请根据需要设置高强度密码

修改主密钥可以使用:

更多:https://msdn.microsoft.com/zh-cn/library/ms186937.aspx

use master;
ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '$$123123$$';

2、在 master 数据库中,添加 加密数据库用的证书:

更多:https://msdn.microsoft.com/zh-cn/library/ms187798(v=sql.120).aspx

USE master;
CREATE CERTIFICATE TestCert WITH SUBJECT = '测试证书';

其中,TestCert 是证书名称,可以根据需要随便起名,但是要记住!Subject 是主题貌似,随便写就可以了,长度最好不要超过128字节。

3、在 要加密的数据库 中,设置 证书以及加密算法:

更多:https://msdn.microsoft.com/zh-cn/library/bb677241.aspx

USE TestDB
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128
ENCRYPTION BY SERVER CERTIFICATE TestCert;

其中,TestCert 就是上一步中添加的证书名称,Algorithm 是加密算法,有:AES_128 | AES_192 | AES_256 | TRIPLE_DES_3KEY ,请根据需要选择强度适合的加密算法。

4、对 要加密的数据库 启用加密:

ALTER DATABASE TestDB SET ENCRYPTION ON;

嗯,经过以上步骤,对数据库的加密就完成了。

想要查看当前数据库服务器中有哪些数据库已被加密,可执行以下语句:

SELECT DB_NAME(database_id) AS DatabaseName, * FROM sys.dm_database_encryption_keys;

 

不过,还得考虑后续恢复数据库或者转移到其它服务器的问题。

5、首先要从 master 数据库中,备份加密证书:

更多:https://msdn.microsoft.com/zh-cn/library/ms178578.aspx

USE master;
BACKUP CERTIFICATE TestCert TO FILE = 'D:\TestCert.cer'
WITH PRIVATE KEY ( FILE = 'D:\TestCert.pkey', ENCRYPTION BY PASSWORD = '$$certpwd$$' );

嗯,证书名称,保存的文件名,同时保存一下私钥,私钥的文件名,以及加密私钥的密码(此密码用于保护私钥,恢复时使用)。

6、在其他数据库服务器中,仍然首先建立 数据库主密钥,同第1步操作;

7、然后,开始从文件中恢复证书:

USE master;
CREATE CERTIFICATE TestCert FROM FILE = 'D:\TestCert.cer'
WITH PRIVATE KEY ( FILE = 'D:\TestCert.pkey', DECRYPTION BY PASSWORD = '$$certpwd$$');

是的,恢复证书其实就是从文件创建证书,证书名称、文件路径、私钥文件路径、以及解密私钥的密码(备份加密时设置的)。

8、然后你就可以附加数据库、恢复数据库什么的了~

需要注意的是,数据库加密的关键是 那个证书数据库主密钥 是用来保护数据库信息的,比如证书的存放什么的,并不直接关系到数据库的加密。

所以,一定要备份好证书!!!不然别到时候哭着解密不了数据库。

这个部分的参考文章:http://blog.csdn.net/ws_hgo/article/details/6927152

 

最后呢,说说这个方法的不好,那就是这个方法是对整个数据库的数据加密,包括日志什么的,可能会为cpu带来一定的负担。

而且在备份的时候因为此时数据库已经处于加密状态,所以无法进行太多的压缩了,可能备份文件体积较大。

其实我比较关心的一点是,这个 透明数据加密(TDE) 只有 Enterprise (企业版)拥有,其它版本是木有的~

 

3、直接对备份进行加密【此方法适用于 sql server 2014 及以后的版本(应该?)】

这个方法和第一种比较像,直接在备份时加参数,仅仅对备份加密,不会加密数据库,但是呢,也需要跟第二种方法一样,需要先创建证书。

1、算了,要不我就不重复写了,请看第二种方法的第1步。。。

2、请参见第二种方法的第2步。。。

3、恩恩,此时就可以开始备份数据库了!

BACKUP DATABASE TestDB TO DISK ='D:\TestDB.bak' WITH COMPRESSION,
ENCRYPTION (ALGORITHM = AES_256, SERVER CERTIFICATE = TestCert);

其中,前半句应该很熟悉,就是备份数据库的语句,Compression 是压缩选项

后半句就是加密,Algorithm 是加密算法,TestCert 就是我们添加的证书了。

 

备份就这样建完了。当然也得涉及到在其它服务器上的恢复问题。

4、好吧,我又懒了,其实就是第二种方法中的第 5、6、7 步,备份证书,恢复证书。。。

5、嗯,又可以愉快的恢复备份了~

这个部分的参考文章:http://www.cnblogs.com/CareySon/p/3853016.html

 

呵呵,前面说了这么多,其实直接说这个多好,是吧,首先在版本方面,比TDE多了两个版本,但是还是没有我想要的。。。

其次呢,压缩也可以用的上了,不过备份压缩与备份加密支持的版本是一样的。。。

还有呢,只支持 2014(和以后的版本?),想必现在应该有不少数据库还是 2008 甚至 2005。。。

 

总结

所以说呢,其实这几个方法都不是太满意。。。大家就根据自己的情况使用吧,至于我呢。。。根据我的需求,我准备还是用zip压缩加密一下吧。。。

哎,浪费了一个上午研究数据库备份加密,又浪费了一个中午写这篇文章,算是一个上午没白浪费吧,没准以后用上呢。。。

对 sql server 数据库的备份进行加密的更多相关文章

  1. 用分离、附加的方式实现sql server数据库的备份和还原

    一.数据库分离.附加的说明 SQL Server提供了"分离/附加"数据库."备份/还原"数据库.复制数据库等多种数据库的备份和恢复方法.这里介绍一种学习中常用 ...

  2. SQL Server数据库定时备份解决方案

    SQL Server数据库定时备份解决方案 1.本方案采用软件为:SQLBackupAndFTP 10.0.3 版本,压缩包自带注册机,请自行破解. 2.软件截图如下: 3.功能说明:自动定时备份相关 ...

  3. SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法

    SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法 在使用数据库的过程中,经常会遇到数据库迁移或者数据迁移的问题,或者有突然的数据库损坏,这时需要从数据库的备 ...

  4. 数据库开发基础 SQL Server 数据库的备份、还原与分离、附加

    认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是 一.在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点 二. ...

  5. 第一章、关于SQL Server数据库的备份和还原(sp_addumpdevice、backup、Restore)

    在sql server数据库中,备份和还原都只能在服务器上进行,备份的数据文件在服务器上,还原的数据文件也只能在服务器上,当在非服务器的机器上启动sql server客户端的时候,也可以通过该客户端来 ...

  6. SQL Server数据库的备份和还

    转:http://blog.csdn.net/zwj7612356/article/details/8188025 在sql server数据库中,备份和还原都只能在服务器上进行,备份的数据文件在服务 ...

  7. C#对SQL Server数据库的备份与还原

    备份数据库: string connectionString = "server=服务器名称;database=数据库名;uid=登入名;pwd=登入密码";         // ...

  8. sql server数据库自动备份

    SqlServer 数据库自动备份的两种解决方案 SQL Server中的角色(服务器级别和数据库级别角色) SqlServer服务器角色和数据库角色相关操作

  9. 关于 SQL Server 数据库批量备份与还原的一些 Tips

    一.前提 最近需要将服务器 A 上的数据库全部备份,并在服务器 B 上进行还原,30多个数据库一个一个地用鼠标点,先是 backup,之后时 restore……整个过程实在是太浪费时间了!于是直接写一 ...

随机推荐

  1. VC++中的头文件包含问题

    在一些大的工程中,可能会包含几十个基础类,免不了之间会互相引用(不满足继承关系,而是组合关系).也就是需要互相声明.好了,这时候会带来一些混乱.如果处理得不好,会搞得一团糟,根据我的经验,简单谈谈自已 ...

  2. 【SQL】行转列过滤,使用别名和不使用别名的区别用法。

    需求为: 仿太平洋网站筛选. 多选类型的字段应采用‘并且’:单选和录入类型的字段应采用‘或者’ 比如有如下选项: 参数头 参数体 操作系统(多选) win7 win8 运行内存(单选) 2G 4G 商 ...

  3. iOS MBProgressHUD 之带底板的加载提示

    文章来自:http://blog.csdn.net/ryantang03/article/details/7877120 MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单 ...

  4. CodeForces 508C Anya and Ghosts 贪心

    做不出题目,只能怪自己不认真 题目: Click here 题意: 给你3个数m,t,r分别表示鬼的数量,每只蜡烛持续燃烧的时间,每个鬼来时要至少亮着的蜡烛数量,接下来m个数分别表示每个鬼来的时间点( ...

  5. java数组中的三种排序方法中的冒泡排序方法

    我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...

  6. mysqldump 备份数据说明+ 避免锁表

    1.mysqldump命令备份Mysql数据库的参数说明 在用mysqldump备份使用那些参数选项是最完美的组合呢?--skip-opt--create-option                 ...

  7. POJ 1142 质因数分解

    只要很朴素的分解就可以了,数据量不大 #include <stdio.h> #include <string.h> #include <stdlib.h> #inc ...

  8. 使用adb签名并安装Android程序

    首先需要准备Android SDK包,我是在windows上操作的,在PATH中配置  YOUT_SDK_PATH\android-sdk-windows\platform-tools 和  YOUT ...

  9. Linux高性能server编程——高级I/O函数

     高级I/O函数 pipe函数 pipe函数用于创建一个管道,实现进程间的通信. #include <unistd.h> int pipe(int pipefd[2]); 通过pipe ...

  10. Hiddenfield控件

    本文转自:http://www.cnblogs.com/weicleer/archive/2012/11/26/2788722.html ASP.NET2.0 HiddenField控件(1)2007 ...