利用加密保護SQL Server中的敏感數據

 鈴……一陣手機鈴聲響起,領導打來電話,語氣比較沉重,CRM系統所使用的數據庫被人無故做了分離以及重新附加的操作。這就意味着此數據庫文件存在被複制的可能。這無疑是一個晴天霹靂的壞消息。作爲國內比較大的汽車銷售公司來說,這些數據一旦失竊或是泄露出來將對企業來說將帶來不可估量的損失。第一時間報告上級領導進行監控及審覈排查;另一方面要求信息技術部門立即着手加強數據安全管理,還好本單位使用的是SQL Server數據庫。從SQL Server2005開始,中有一個令人激動的新特性,內置數據加密的功能。實現了完整的加密基礎結構,不需要再借此其他工具就可以實現完整的加密,解密操作。利用好此功能,即使存儲設備失竊也不用擔心數據泄露的問題。

首先看一下數據庫加密體系結構,整個加密體系看起來挺複雜的,但其實很簡單,這個加密體系分爲多個加密級別,如下圖所示:

 


第一個級別:是windows級別。主要使用的是Windows的DPAPI(數據保護API)使用的是用戶的憑據,也就是使用用戶的密碼來對需要保護的對象進行加密的一種方法。在這裏主要是使用WINDOWS級別的用戶憑據對第二個級別也就是SQL SERVER服務器級別進行加密。

第二個級別:SQL SERVER的服務器實例級別。這一個層次有一個服務主密鑰,但是這個服務主密鑰必須使用DPAPI(也就是第一個級別的用戶憑據)進行加密。而這個服務主密鑰又用於對第三個級別:數據庫主密鑰進行加密。也就是說上層必須爲下層服務。

第三個級別:主數據庫級別。存在一個數據庫主密鑰,它可以加密數據庫中的其他對象(如非對稱,證書進行保護,但不保護對稱密鑰),對稱密鑰不使用數據庫主密鑰加密,我們從圖中可以看出來,對稱密鑰使用證書,非對稱密鑰或是指定的密碼加密,同時又被第二級別服務主密鑰所保護。

第四個級別:用戶數據庫級別。當數據庫中有了數據庫主密鑰後就可以使用數據庫主密鑰來保護數據庫中的證書和非對稱密鑰,再使用對稱密鑰來保護其他對稱密鑰和數據,當然也可以直接使用證書和非對稱密鑰來保護數據。  

下面咱們來逐個看一下各種密鑰:

服務主密鑰:在安裝SQL SERVER時自動生成的一個密鑰,是128BIT的3DES密鑰。 作用:直接或者是間接地保護體系中的其他密鑰。使用SQL Server的配置管理器更改服務帳戶,能夠自動完成加密和解密的過程。服務主密鑰是安裝時自動生成的,所以我們不能創建,但是我們可備份和還原服務主密鑰。

備份:Backup service master key to  file=’c:\bak\smk.bak’ encryption by password=’DUfei2008’

備份的時候必須使用一個強密碼,因爲如果要是沒有密碼保護的話,那麼其他人很容易進行還原,得到你的服務主密鑰。

還原:必須給定備份時的密碼:Restore service master  key from file=’c:\bak\smk.bak’ decryption by password=’DUfei2008’  

下面咱們來看一下數據庫主密鑰:

注意:  

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。  

下面咱們就看一下具體的實例:

咱們就以dufei數據庫爲例,先看一下服務主密鑰。咱們前面已經介紹了,它不是咱們手動創建出來的,在安裝SQL SERVER時就已經存在了。我們做的只能是備份和還原。

備份: backup service master key to  file='c:\bak\smk.bak' encryption by password='DUfei2008'

還原:restore service master key from  file='c:\bak\smk.bak' decryption by password='DUfei2008'

生成新的服務主密鑰, 適應於更改服務帳戶的情況,一般推薦使用配置管理器更改服務帳戶:alter service master key regenerate
      ---------數據庫主密鑰---

1)爲當前dufei數據庫創建數據庫主密鑰

use dufei

create   master key encryption by password='DUfei2008'

2)查看數據庫加密狀態

select * from sys.databases where  name='dufei'

3)  查看數據庫主密鑰的信息

select * from sys.symmetric_keys    

4)備份數據庫主密鑰

backup master key to file='c:\bak\dmk.bak'  encryption by password='DUfei2008'

默認情況下,創建數據庫主密鑰會被服務主密鑰所保護的,但有的時候我們不希望數據庫主密鑰使用服務主密鑰保護,那麼就可以刪除服務主密鑰對數據庫主密鑰的保護。我們先不刪除,我們來利用數據庫主密鑰創建非對稱密鑰,可以直接創建。

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) 還原證書

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) )

以上介紹的是SQL Server中實現數據加密過程,至於非對稱加密、對稱加密、混合加密的操作過程基本相同,甚至在操作過程還可以引入驗證因子防止繞過數據加密的攻擊等,使用好數據加密功能,就不用再擔心數據丟失問題了,安全無小事,可不能大意呀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章