可能通过目录视图来查看查看数据库主密钥状态,如下所示:
Sys.symmetric_keys 查看有关数据库主密钥的信息
Sys.databases 中 is_master_key_encrypted_by_server列指示是否使用服务主密钥对数据库主密钥进行保护。
备份数据库主密钥:
如:
Backup master key to file=’c:\bak\dmk.bak’ encryption by password=’DUfei2008’
还原数据库主密钥:
Restore master key from file=’c:\bak\dmk.bak’ decryption by password=’旧密码’ encryption by password=’新密码’
下面咱们来看一下使用数据库加密保护数据。要保护数据,必须有一个可以保护数据的密钥,这个密钥有三种,对称密钥,非对称密钥和证书(公钥加密,私钥解密),有了密钥才可能去对数据进行加密,所以我们还得先来看一下如何创建相应的密钥,也就是如何创建证书,创建对称密钥,创建非对称密钥,然后再利用这些密钥对数据进行加密。
咱们先看一下创建证书:
注意:创建自签名的证书(也可以使用现有的CA进行证书的颁发)
创建自签名证书语法:
私钥可以用数据库 主密钥保护也可以使用指定的口令加密
Create certificate 证书名 encryption by password=’密码’ with subject=’ 主题’,
Start_date=’起始日期’ expiry_data=’到期日期’
其中这个口令用于保护咱们的私钥,主题,就是一个描述信息(无所谓),有效期在这里不是很严格,需要结合程序或者存储过程来进行检查。
更改用于加密私钥的密码或者是删除私钥的情况如下:
第一种情况适合于口令泄露的情况,不安全
第二种情况适合于只加密不解密的情况,很常见如一些注册用户密码,不希望管理看到。看不到原文,但是用户一样可以使用。
--修改私钥的口令
alter certificate cert1 with private key (decryption by password='DUfei2008',encryption by password='DUfei2008')
备份证书(导出证书)
Backup certificate 证书名 to file=’c:\bak\mycert.cer’ with private key (decryption by password=’旧口令’,file=’c:\bak\mycertpvt’,encryption by password=’私钥的口令’)
还原(导入)
-- 还原证书 在此不用restore 而是create 导入
create certificate cert1 from file='c:\bak\mycert.cer' with
private key (file='c:\bak\mypvt' ,decryption by password='DUfei2008',encryption by password='DUfei2008'
)
删除证书的私钥:
Alter certificate 证书名 remove private key
--增加私钥
alter certificate cert1 with private key (file='c:\bak\mypvt',
decryption by password='DUfei2008',encryption by password='DUfei2008')
另外还要用到一些与证书相关的函数:
Encryptbycert(证书ID,加密文本) 加密
Decryptbycert( 证书ID,密文,加密口令) 解密
Cert_id(证书名) 得到证书ID,因为加密,解密使用的都是ID
非对称密钥和对称密钥的操作方法类似,不再细述。
下面咱们就看一下具体的实例:
咱们就以dufei数据库为例,如果对敏感数据进行加密。
服务主密钥:咱们前面已经介绍了,是不需要创建的,在安装SQL SERVER时就已经存在了。我们做的只能是备份和还原:
create database dufei --创建数据库
1)备份
backup service master key to file='c:\bak\smk.bak' encryption by password='DUfei2008'
2)还原:
restore service master key from file='c:\bak\smk.bak' decryption by password='DUfei2008'
3) 生成新的服务主密钥 适应于更改服务帐户的情况,一般推荐使用配置管理器更改服务帐户
alter service master key regenerate
数据库主密钥:
1) 为当前dufei数据库创建数据库主密钥
use dufei
create master key encryption by password='DUfei2008'
2)查看数据库加密状态
select * from sys.databases where name='dufei'
此时 is_master_key_encrypted_by_server 为1 使用服务主密钥加密
3) 查看数据库主密钥的信息
select * from sys.symmetric_keys
可以得知长度和算法
4)备份数据库主密钥
backup master key to file='c:\bak\dmk.bak' encryption by password='DUfei2008'
5)删除服务主密钥对数据库主密钥的保护
默认情况下,创建数据库主密钥会被服务主密钥所保护的,但有的时候我们不希望数据库主密钥使用服务主密钥保护,那么就可以删除服务主密钥对数据库主密钥的保护。
我们先不删除,我们来利用数据库主密钥创建非对称密钥,可以直接创建
Create asymmetric key asy_key1 with algorithm=RSA_1024 --成功
语法:
Alter master key drop encryption by service master key
再次查看数据库的加密状态
Select * from sys.databases where name=’dufei’
--主要是看 is_master_key_encrypted_by_server 已经是0了。说明不被服务主密钥保护了。
此时我们再创建一个非对称密钥,则不成功
Create asymmetric key asy_key2 with algorithm=RSA_1024 --失败了
因为这个时候数据库主密钥不会自动打开了,必须打开数据库主密钥再创建
Open master key decryption by password=’DUfei2008’
Select * from sys.openkeys 显示打开的数据库主密钥
然后再创建非对称密钥则可以成功,如下
Create asymmetric key asy_key2 with algorithm=RSA_1024 成功了
可以通过图形界面查看一下,非对称密钥中已经出现了我们所创建的密钥
这个实验是告诉大家,如果你删除了服务主密钥对数据库主密钥的保护,那么每次必须手动打开数据库主密钥,挺麻烦的,所以我们还可以恢复服务主密钥对数据训主密钥的保护
1) 恢复服务主密钥对数据库主密钥的保护
Alter master key add encryption by service master key
2) 关闭数据库主密钥
Close master key
下面咱们来看看使用证书对数据进行加密
-----------------证书对数据加密 ---------------
1)生成自签名证书
--使用指定口令保护私钥
create certificate cert1 encryption by password='DUfei2008'
with subject='test', start_date='01/01/2009',expiry_date='01/01/2010'
--使用数据库主密钥保护私钥
create certificate cert2
with subject='test',start_date='01/01/2009',expiry_date='01/01/2010'
2) 查看证书信息
select * from sys.certificates
3) 修改私钥的口令
alter certificate cert1 with private key (decryption by password='DUfei2008',encryption by password='DUfei2008')
4) 备份证书
backup certificate cert1 to file='c:\bak\mycert.cer' with private key
(decryption by password='DUfei2008',file='c:\bak\mypvt',encryption by password='DUfei2008')
5) 删除私钥
alter certificate cert1 remove private key
6 ) 增加私钥
alter certificate cert1 with private key (file='c:\bak\mypvt',
decryption by password='DUfei2008',encryption by password='DUfei2008')
7) 删除证书
drop certificate cert1
8) 还原证书 在此不用restore 而是create 导入
create certificate cert1 from file='c:\bak\mycert.cer' with
private key (file='c:\bak\mypvt' ,decryption by password='DUfei2008',encryption by password='DUfei2008'
)
declare @atext varchar(100),@acipher varbinary(max)
set @atext='dufei hao!'
set @acipher=encryptbycert(cert_id('cert1'),@atext)
select @acipher
select cast(decryptbycert(cert_id('cert1'),@acipher,N'DUfei2008')as varchar(200) )
注意:在此必须将@acipher 定义为varbinary 因为,已经是一个密文,不是普通字符了!
通过以上讲解,大家发现数据库加密也不是一件很难的事情,不仅SQL Server支持,其他数据库管理系统都支持,但实现方法各不相同。希望用户明文密码的事件不再发生,换回用户对网站的信任,数据库加密刻不容缓!