sql 2005数据库加密实战

happydreamer(www.sz.js.cn,www.gyxk.com)2006-10-11 08:44:05 在 MS-SQL Server / 新技术前沿 提问

转贴自teched讲师:     牛可      
   
  基本概念:  
   
  第一层   服务主密钥    
   
  备份服务主密钥  
  backup   service   master   key   to   file='c:\smk.bak'  
  encryption   by   password='P@ssw0rd'  
     
  restore   service   master   key   from   file='c:\smk.bak'  
  decryption   by   password='P@ssw0rd'  
     
  第二层   数据库主密钥  
  1)必须先在该数据库上创建数据库主密钥才能使用  
  create   master   key   encryption   by   password='P@ssw0rd'  
     
  2)使用数据库主密钥  
  -如果数据库主密钥使用服务密钥进行保护,则在使用时会自动打开  
  opren   master   key   decryption   by   password='P@ssw0rd'  
     
  3)查看数据库主密钥状态  
  sys.symmetric_keys  
     
  4)备份数据库主密钥  
  backup   master   key   to   file='c:\smk.bak'  
  encryption   by   password='P@ssw0rd'  
     
  restore   master   key   from   file='c:\smk.bak'  
  decryption   by   password='P@ssw0rd'  
     
     
  数字证书  
  创建自签名  
  create   certificate   cert_myCert  
  encryption   by   password='P@ssw0rd'  
  with   subject='Self   Signed   Cert',  
  start_date='1/31/2006'  
  expiry_date='1/31/2008'  
     
     
  非对称密钥  
  创建新的密钥对  
  create   asymmetric   key   asy_Key1  
  with   algorithm=RSA_2048  
  encryption   by   password='P@ssw0rd'  
     
     
  对称密钥  
  创建新的密钥对  
  create   symmetric   key   SymKeyMarketing3  
  with   algorithm=AES_2048  
  encryption   by   certificate   asy_Key1  
     
  使用对称密钥  
  使用前必须打开  
  open   symmetric   SymKeyMarketing3  
  decryption   by   certificate   asy_Key1  
     
  sys.open_keys  
     
     
  数据列加密  
  -使用对称密钥加密大量的列数据  
  -考虑使用证书,非对称密钥保护对称密钥  
     
  防止绕过加密数据列的攻击-使用验证器  
     
  注:  
  在加密列上的索引将变得无效  
  加密数据列的长度增长,建议使用varbinary(max)数据类型  
  修改已有的dml语句以支持加密的数据列  
     
  -----***********示例1   了解数据库加密体系结构*****-----  
     
  --************(1)   服务主密钥  
  --准备工作  
  --创建测试数据库TestDB  
   
  --1)备份服务主密钥  
  backup   service   master   key   to   file='g:\smk.bak'  
  encryption   by   password='p@ssw0rd'  
     
  --2)生成新的主密钥  
  Alter   service   master   key   regenerate  
     
  --3)从备份文件还原服务主密钥  
  Restore   service   master   key   from   file=   file='g:\smk.bak'  
  encryption   by   password='p@ssw0rd'  
     
  --*************(2)   数据库主密钥  
  --1)为数据库创建数据库主密钥  
  create   master   key   encryption   by   password='p@ssw0rd'  
  go  
   
  --2)查看数据库加密状态  
  select   [name],is_master_key_encrypted_by_server    
  from   sys.databases   where   name='TestDB'  
     
  --3)查看数据库主密钥的信息  
  select   *   from   sys.symmetric_keys    
     
  --4)备份数据库主密钥  
  backup   master   key  
  to   file='g:\testdbkey.bak'  
  encryption   by   password='p@ssw0rd'  
     
  --5)删除服务主密钥对数据库主密钥的保护  
  --创建非对称密钥成功,自动使用服务主密钥解密并使用该数据库主密钥  
  create   asymmetric   key   asy_Testkey1   with   algorithm=RSA_1024  
  go  
  --删除服务主密钥对数据库主密钥的保护  
  alter   master   key  
  drop   encryption   by   service   master   key  
  go  
     
  --查看数据库加密状态  
  select   [name],is_master_key_encrypted_by_server    
  from   sys.databases   where   name='TestDB'  
     
  --创建非对称密钥失败,因为数据库主密钥未打开  
  create   asymmetric   key   asy_Testkey2   with   algorithm=RSA_1024  
  go  
   
  --打开数据库主密钥  
  open   master   key   decryption   by   password='p@ssw0rd'  
  select   *   from   sys.openkeys  
  go  
   
  --创建非对称密钥成功  
  create   asymmetric   key   asy_Testkey2   with   algorithm=RSA_1024  
  go  
     
  --恢复服务主密钥对数据库主密钥的保护  
  alter   master   key  
  add   encryption   by   service   master   key  
  close   master   key  
  go  
     
  --*****(3)证书  
  --1)创建自签名证书  
  create   certificate   cert_Testcert  
  encryption   by   password='p@ssw0rd'  
  with   subject='TestCert1',  
  start_date='1/31/2006',  
  expiry_date='1/31/2008'  
  go  
   
  select   *   from   sys.certificates  
     
     
  --2)从文件导入证书  
  Create   certificate   cert_TestCert2  
  From   file=’g:\MSCert.cer’  
  Go  
     
  --   3)备份导出证书和密钥  
  backup   certificate   cert_Testcert  
  to   file='g:\Testcert.cer'  
  with   private   key  
  (decryption   by   password='p@ssw0rd',  
  file='g:\TestCert_pvt',--私密钥  
  encryption   by   password='p@ssw0rd'   )  
  go  
     
  --4)使用证书加解密数据  
  --加密:使用证书的公钥  
  declare   @cleartext   varbinary(200)  
  declare   @cipher   varbinary(200)  
  set   @cleartext=convert(   varbinary(200),'Test   text   string')  
  set   @cipher=EncryptByCert(Cert_ID('cert_TestCert'),@cleartext)  
  select   @cipher  
     
  --解密:使用证书的私钥  
  select   convert(varchar(200),DecryptByCert(Cert_ID('cert_TestCert'),@cipher,N'p@ssw0rd'))   as   [cleartext]  
     
     
  --5)   删除证书私钥  
  alter   certificate   cert_TestCert  
  remove   private   key  
  go  
     
  --加密成功  
  declare   @cleartext   varbinary(200)  
  declare   @cipher   varbinary(200)  
  set   @cleartext=convert(   varbinary(200),'Test   text   string')  
  set   @cipher=EncryptByCert(Cert_ID('cert_TestCert'),@cleartext)  
  select   @cipher  
     
  --解密失败:因为私钥被删除  
  select   convert(varchar(200),DecryptByCert(Cert_ID('cert_TestCert'),@cipher,N'p@ssw0rd'))   as   [cleartext]  
     
     
  --***(4)   非对称密钥  
  --1)使用sn.exe生成非对称密钥,安装vs2005后有sn.exe,   在命令行方式下执行  
  sn   -k   g:\asy_Test.key  
     
  --2)从文件创建非对称密钥  
  create   asymmetric   key   asm_Test  
  from   file='g:\asy_Test.key'  
  encryption   by   password='p@ssw0rd'  
  go  
     
  select   *   from   sys.asymmetric_keys  

转载于:https://www.cnblogs.com/Steven-zhou-2005/archive/2008/03/27/1124825.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值