前几天研究了一下sql数据库的透明加密,记下来加深一下理解.

用脚本创建文件夹

 --查文件夹有没有
EXEC master.dbo.xp_fileexist 'D:\DATA\storedcerts'
EXEC master.dbo.xp_fileexist 'D:\DATA\storedkeys' --开启系统存储过程高级选项
EXEC sp_configure 'show advanced options',1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
GO
--调用DOS命令创建storedcerts文件夹
EXEC xp_cmdshell 'mkdir D:\DATA\storedcerts'
GO
--调用DOS命令创建storedkeys文件夹
EXEC xp_cmdshell 'mkdir D:\DATA\storedkeys'

下面开始加密

 USE MASTER;
GO
--删除原有的证书和密钥,保险一点,如果没有会报错不用管
DROP CERTIFICATE MyServerCert
GO
DROP MASTER KEY
GO --在MASTER数据库中创建一个MASTER KEY,密码是zz.www
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'zz.www';
GO --使用MASTER KEY创建证书MyServerCert
CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My DEK Certificate';
GO USE ceshi;
GO
--在ceshi数据库上使用MyServerCert这个证书创建数据库私钥
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128
ENCRYPTION BY SERVER CERTIFICATE MyServerCert;
GO

接下来是备份数据库主密钥,数据库证书和证书私钥.

在创建证书时数据库会提示备份证书以及相关私钥,在没弄明白之前笔者只备份了证书,没有管私钥,虽然私钥是会在备份证书的时候带到证书里面去,但是显然笔者把证书想简单了,等还原证书解密的时候,才发现数据库主密钥和证书私钥是两码事,后面解密的时候解释这个问题

 USE MASTER;
GO
--备份数据库主密钥MASTER KEY
BACKUP MASTER KEY TO FILE = 'D:\DATA\storedkeys\masterkey' ENCRYPTION BY PASSWORD = 'zz.www'
GO --备份数据库证书和私钥
BACKUP CERTIFICATE MyServerCert TO FILE = 'D:\DATA\storedcerts\MyServerCert.cer'
WITH PRIVATE KEY ( FILE = 'D:\DATA\storedkeys\MyServerCert.pvk' ,
ENCRYPTION BY PASSWORD = 'zz.www' );
GO --将ceshi数据库设置为加密
ALTER DATABASE ceshi SET ENCRYPTION ON;
GO

到这里ceshi数据库就加密成功了.

下面是解密过程,笔者只是用到了把加密的数据库的备份文件或者数据库原文件还原或者附加到另外的实例数据库中.

在这里就遇到了问题,刚开始笔者用备份好的密钥和证书直接还原到新实例上面,提示都还原成功了,但是用备份文件进行还原的时候,还是会提示密钥不对.

然后笔者尝试删除密钥和证书,虽然提示笔者删掉了,而且在系统表里面查询也确实没有了,但是在还原的时候依旧报错,提示需要证书

找了下原因,官方说法:即使对于数据库不再启用加密,用于保护数据库加密密钥的证书备份也应保留。 即使数据库不再加密,事务日志的某些部分仍可能保持受到保护,但在执行数据库的完整备份前,对于某些操作可能需要证书。
说是删除,实际上并没有,也是,如果直接就删了,那这透明加密就没什么卵用了;也就是说即使密钥删了,但是证书还在,私钥还在,即使是用DROP CERTIFICATE MyServerCert 来删除证书,然后把当前数据库拿到其他数据库实例上面还原,也是无法成功的.

然后在还原好了主密钥和证书,私钥之后,数据库却提示当前数据库实例不支持透明加密功能,这才知道,虽然大部分的数据库版本均可以进行加密操作,但是在新实例上面做一些还原或者附加等操作的,必须要求新的数据库实例是企业版的才可以完美操作.

 --查询数据库实例版本等信息
SELECT SERVERPROPERTY('productversion') as '产品版本', SERVERPROPERTY ('productlevel') as '产品级别' , SERVERPROPERTY ('edition') as '版本'

下面是笔者总结的成功还原数据库并且可以正常操作数据库数据的解密方法

还原主密钥,还原证书和证书私钥,重点就是证书私钥

 --还原MASTER KEY
USE MASTER
RESTORE MASTER KEY
FROM FILE = 'D:\DATA\storedkeys\masterkey'
DECRYPTION BY PASSWORD = 'zz.www'
ENCRYPTION BY PASSWORD = 'zz.www';
GO --还原证书和私钥
CREATE CERTIFICATE MyServerCert
FROM FILE = 'D:\DATA\storedcerts\MyServerCert'
WITH PRIVATE KEY (FILE = 'D:\DATA\storedkeys\MyServerCert.pvk',
DECRYPTION BY PASSWORD = 'zz.www');
GO --还原数据库
RESTORE DATABASE ceshi
FROM disk = 'F:/DATA/2015-07-06'
WITH MOVE 'Test' TO 'd:\DATA\ceshi.mdf',
MOVE 'Test_log' TO 'd:\DATA\ceshi_log.ldf'
GO

到这里数据库还原成功就ok了

此文个人观点,有不对之处,欢迎指正.

SqlServer2008数据库透明加密的更多相关文章

  1. ORACLE透明加密

    --官网文档:https://www.oracle.com/technetwork/cn/tutorials/tde-096009-zhs.html#t概述Oracle 数据库 10g 第 2 版透明 ...

  2. hadoop 透明加密

    hadoop 透明加密 hadoop 透明加密 kms transparent 2015年04月09日 18:12:20 糖糖_ 阅读数:12248 标签: transparenthadoop kms ...

  3. KingbaseES 表空间加密-透明加密

    透明存储加密是指数据在写到磁盘上时对其进行加密,当授权用户重新读取数据时再对其进行解密.加密解密过程对用户都是透明的,无需对应用程序进行修改,授权用户甚至不会注意到数据已经在存储介质上加密.当前的透明 ...

  4. Java连接SqlServer2008数据库(转)

    Java连接SqlServer2008数据库 首先下载JDBC:下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=21599 下 ...

  5. Sqlserver2008 数据库镜像会话的初始连接

    sqlserver2008 数据库镜像服务配置完成后,大家会发现我们有了两个数据库服务,这两个服务可以实现自动故障转移,那么我们的程序如何实现自动连接正常的数据库呢? 这个问题很简单,使用ADO.NE ...

  6. 在Winform开发框架中实现对数据库的加密支持

    在很多情况下,我们需要对数据库进行加密,特别是Access数据库.Sqlite数据库,这些直接部署在客户端的数据,因为数据也是客户的资产,数据库总是存在很多相关的秘密或者重要的业务数据,所以一般来说, ...

  7. SQLServer2008数据库安装图解

    SQLServer2008数据库安装图解... ======================================= 解压下载的安装包,右键运行Setup.exe文件 =========== ...

  8. 在Winform开发框架中实现对数据库的加密支持(转)

    在很多情况下,我们需要对数据库进行加密,特别是Access数据库.Sqlite数据库,这些直接部署在客户端的数据,因为数据也是客户的资产,数据库总是存在很多相关的秘密或者重要的业务数据,所以一般来说, ...

  9. 将MySQL数据库转移到SqlServer2008数据库

    由于工作需要用到了将MySQL数据库转成SqlServer数据库,查了一些资料发现将SqlServer数据库转成MySQL数据库的文章很多,但是反过来的就很少了.下面就将自己的方法分享给大家. 这里用 ...

随机推荐

  1. 解决Xcode6.4安装插件后插件不能使用的问题

    下面是上网查的方法,综合了一下,亲测 原因: 苹果要求加入UUID证书从而保证插件的稳定性. 解决方法: 一.查看Xcode的UUID 在终端执行 defaults read /Application ...

  2. Ext.net GridPanel获取选中行的数据

    1.前台页面 在button中添加ExtraParams   <DirectEvents> <Click> <ExtraParams> <ext:Pramet ...

  3. 进阶笔记(2)——JavaScript语言精碎

    正则       /     正则表达式      / ^   表示字符串开始 (?:...)   表示一个非捕获型分组(没多大意义) 后缀 ? 表示匹配 0 或 1次 ( ... )   表示捕获型 ...

  4. Spark RDD设计学习笔记

    本文档是学习RDD经典论文<Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster ...

  5. (原)Ubuntu16 中安装torch版的cudnn

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5668471.html 参考网址: https://devtalk.nvidia.com/default ...

  6. SSH 5W学习

    what SSH的英文全称为Secure Shell,是IETF(Internet Engineering Task Force)的Network Working Group所制定的一族协议,其目的是 ...

  7. JavaScript函数学习要点总结(一)

    1.函数的最大作用是提供代码复用: 2.JavaScript函数是弱类型语言,定义函数时既不要声明函数的返回值,也不要声明函数的参数列表类型: 语法如下: function functionName( ...

  8. POJ3026 最小生成树

    问题: POJ3026 分析: 采用BFS算出两两之间的距离,再用PRIM算法计算最小生成树. AC代码: //Memory: 220K Time: 32MS #include <iostrea ...

  9. T-SQL 游标

    游标是面向行的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能. 在性能上,游标会迟更多的内存,减少可用的并发,占用带宽,锁定资源,当然还有更多的代码量. 用一个比喻来说明为什么游标会占 ...

  10. 外部样式OL LI的定义 影响到了富文本框内的UL LI的定义,使用内部样式对其还原

    <style type="text/css"> #intro { white-space: normal; word-break: break-all; overflo ...