无线组网 频道

知名网站用户信息泄露 忽视数据库加密

  可能通过目录视图来查看查看数据库主密钥状态,如下所示:

  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支持,其他数据库管理系统都支持,但实现方法各不相同。希望用户明文密码的事件不再发生,换回用户对网站的信任,数据库加密刻不容缓!

0
相关文章