前几天研究了一下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. 自由缩放属性-resize(禁止textarea的自由缩放尺寸功能)

    resize:none|both|horizontal|vertical|inherit 可以用来改变元素的尺寸大小 用上这个属性后元素的有下脚会有一个小图标 拖它就可以了 但是我把resize:bo ...

  2. jquery简单切换插件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  3. iOS-OC-基础-NSDate常用方法

    NSDate常用方法 /*=============================NSDate日期类的使用=============================*/ // 获取当前时间,获得的时 ...

  4. OAuth协议与第三方登录:(QQ,百度,微信,微博)

    OAuth 相当于授权的U盾,提供第三方认证的协议,是个安全相关的协议,作用在于,使用户授权第三方的应用程序访问用户的web资源,并且不需要向第三方应用程序透露自己的密码. 传统互联网:应用于PC端, ...

  5. java多线程什么时候释放锁—wait()、notify()

    由于等待一个锁定线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不需要锁的时候及时释放锁是很重要的.在以下情况下,持有锁的线程会释放锁:    1. 执行完同步代码块.    2. 在执行 ...

  6. DLL技术应用03 - 零基础入门学习Delphi46

    DLL技术应用03 让编程改变世界 Change the world by program DLL的加载和调用 [caption id="attachment_2685" alig ...

  7. Method Resolution Order – Python类的方法解析顺序

    在支持多重继承的编程语言中,查找方法具体来自那个类时的基类搜索顺序通常被称为方法解析顺序(Method Resolution Order),简称MRO.(Python中查找其它属性也遵循同一规则.)对 ...

  8. scp和pscp

    在linux中,我们常用scp命令传输文件: 如以下实例,我们想把当前服务器文件abc.sql传输到192.168.1.1服务器上,我们可以执行以下命令: scp /home/person/hww/a ...

  9. linux修改文件权限

    ubuntu 下修改文件访问权限 Ubuntu下修改目录权限命令如下: chmod 600 name (只有所有者有读和写的权限) chmod 644 name (所有者有读和写的权限,组用户只有读的 ...

  10. C51编程中对单片机绝对地址访问的两种方法

    在进行8051单片机应用系统程序设计时,编程都往往少不了要直接操作系统的各个存储器地址空间.C51程序经过编译之后产生的目标代码具有浮动地址,其绝对地址必须经过BL51连接定位后才能确定.为了能够在C ...