下面我们来看一下数据库主密钥,有三点需要注意:
1、数据库主密钥不会自己生成,必须需要管理员手动创建;
2、由密码保护和服务主密钥同时保护;
3、是128bit的3DES密钥。
创建语法:
Create master key encryption by password=’DUfei2008’ ——由指定的密码和服务主密钥保护。
可以使用密码来解开,如分离后复制到另一个服务器上,因为使用不同的服务账户,那么服务主密钥不同,所以就不能解密使用服务主密钥加密的数据库主密钥。这个时候可以使用加密时所提供的密码来解开数据库主密钥。
我们在创建数据库主密钥的时候,会自动使用服务主密钥进行保护,使用时会自动使用服务主密钥解开数据库主密钥,当然我们也可以删除服务主密钥对数据库主密钥的保护,那么在每一次打开的时候必须手动打开数据库主密钥,因为没有了服务主密钥那么就必须指定在加密时所指定的口令。
打开数据库主密钥语法:
Open master key decryption by password=’DUfei2008’
使用完毕后关闭数据库主密钥:Close master key
也可以修改数据库主密钥,重新生成数据库主密钥,这是很耗资源的一个工作,因为旧的数据库主密钥会解密现有数据,然后使用新的数据库主密钥进行加密。管理员可以根据安全性和适合场合来决定是使用服务主密钥还是删除服务主密钥。管理员还可以通过目录视图Sys.symmetric_keys、Sys.databases 查看数据库主密钥状态。
备份数据库主密钥:
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。