加密是指經過使用密鑰或密碼對數據進行模糊處理的過程。在SQL Server中,加密並不能替代其餘的安全設置,好比防止未被受權的人訪問數據庫或是數據庫實例所在的Windows系統,甚至是數據庫所在的機房,而是做爲當數據庫被破解或是備份被竊取後的最後一道防線。經過加密,使得未被受權的人在沒有密鑰或密碼的狀況下所竊取的數據變得毫無心義。這種作法不只僅是爲了你的數據安全,有時甚至是法律所要求的(像國內某知名IT網站泄漏密碼這種事在中國能夠道歉後不負任何責任了事,在米國妥妥的要破產清算)。html
在SQL Server2000和之前的版本,是不支持加密的。全部的加密操做都須要在程序中完成。這致使一個問題,數據庫中加密的數據僅僅是對某一特定程序有意義,而另外的程序若是沒有對應的解密算法,則數據變得毫無心義。算法
到了SQL Server2005,引入了列級加密。使得加密能夠對特定列執行,這個過程涉及4對加密和解密的內置函數數據庫
SQL Server 2008時代,則引入的了透明數據加密(TDE),所謂的透明數據加密,就是加密在數據庫中進行,但從程序的角度來看就好像沒有加密同樣,和列級加密不一樣的是,TDE加密的級別是整個數據庫。使用TDE加密的數據庫文件或備份在另外一個沒有證書的實例上是不能附加或恢復的。安全
加密是指經過使用密鑰或密碼對數據進行模糊處理的過程。加密解密最簡單的過程如圖1所示。服務器
圖1.一個簡單的加密解密過程函數
一般來講,加密能夠分爲兩大類,對稱(Symmetric)加密和非對稱(Asymmetric)加密。性能
對稱加密是那些加密和解密使用同一個密鑰的加密算法,在圖1中就是加密密鑰=解密密鑰。對稱加密一般來講會比較羸弱,由於使用數據時不只僅須要傳輸數據自己,仍是要經過某種方式傳輸密鑰,這頗有可能使得密鑰在傳輸的過程當中被竊取。測試
非對稱加密是那些加密和解密使用不一樣密鑰的加密算法,在圖1中就是加密密鑰!=解密密鑰。用於加密的密鑰稱之爲公鑰,用於解密的密鑰稱之爲私鑰。所以安全性相比對稱加密來講會大大提升。固然有一長必有一短,非對稱加密的方式一般算法會相比對稱密鑰來講複雜許多,所以會帶來性能上的損失。網站
所以,一種折中的辦法是使用對稱密鑰來加密數據,而使用非對稱密鑰來加密對稱密鑰。這樣既能夠利用對稱密鑰的高性能,還能夠利用非對稱密鑰的可靠性。加密
如今流行的不少加密算法都是工業級的,好比對稱加密的算法有:DES、3DES、IDEA、FEAL、BLOWFISH.而非對稱加密的算法好比經典的RSA。由於這些算法已經公佈了比較長的時間,而且經受了不少人的考驗,因此一般來講都是比較安全的。
SQL Server提供了好比:DES、Triple DES、TRIPLE_DES_3KEY、RC二、RC四、128 位 RC四、DESX、128 位 AES、192 位 AES 和 256 位 AES這些加密算法,沒有某種算法能適應全部要求,每種算法都有長處和短處,關於每種加密算法的細節,請Bing…
但選擇算法有一些共通之處:
強加密一般會比較弱的加密佔用更多的 CPU 資源。
長密鑰一般會比短密鑰生成更強的加密。
非對稱加密比使用相同密鑰長度的對稱加密更強,但速度相對較慢。
使用長密鑰的塊密碼比流密碼更強。
複雜的長密碼比短密碼更強。
若是您正在加密大量數據,應使用對稱密鑰來加密數據,並使用非對稱密鑰來加密該對稱密鑰。
不能壓縮已加密的數據,但能夠加密已壓縮的數據。若是使用壓縮,應在加密前壓縮數據。
在SQL Server中,加密是分層級的.根層級的加密保護其子層級的加密。概念如圖2所示。
圖2.SQL Server加密的層級
由圖2能夠看出,加密是分層級的。每個數據庫實例都擁有一個服務主密鑰(Service Master Key),對應圖2中的橙色部分。這個密鑰是整個實例的根密鑰,在實例安裝的時候自動生成,其自己由Windows提供的數據保護API進行保護(Data Pertection API),服務主密鑰除了爲其子節點提供加密服務以外,還用於加密一些實例級別的信息,好比實例的登陸名密碼或者連接服務器的信息。
在服務主密鑰之下的是數據庫主密鑰(Database Master Key),也就是圖2中土黃色的部分,這個密鑰由服務主密鑰進行加密。這是一個數據庫級別的密鑰。能夠用於爲建立數據庫級別的證書或非對稱密鑰提供加密。每個數據庫只能有一個數據庫主密鑰,經過T-SQL語句建立,如代碼1所示。
代碼1.建立數據庫主密鑰
數據庫主密鑰由代碼1所示的密碼和服務主密鑰共同保護。當數據庫主密鑰建立成功後,咱們就可使用這個密鑰建立對稱密鑰,非對稱密鑰和證書了。如代碼2所示。
--建立證書
CREATE CERTIFICATE CertTest
with SUBJECT = 'Test Certificate' GO --建立非對稱密鑰 CREATE ASYMMETRIC KEY TestAsymmetric WITH ALGORITHM = RSA_2048 ENCRYPTION BY PASSWORD = 'pa$$word'; GO --建立對稱密鑰 CREATE SYMMETRIC KEY TestSymmetric WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = 'pa$$word'; GO
代碼2.建立證書,非對稱密鑰和對稱密鑰
在代碼2中咱們看出,並無顯式指定使用數據庫主密鑰加密證書,對稱密鑰和非對稱密鑰。這是由於每一個數據庫只能有一個數據庫主密鑰,因此無需指定。建立成功後咱們能夠在SSMS中查看到剛剛建立的證書,非對稱密鑰和對稱密鑰,如圖3所示。
圖3.查看剛剛建立成功的證書,非對稱密鑰和對稱密鑰
由這個加密層級不難推斷,若是數據庫主密鑰被破解,則由其所建立的證書,對稱密鑰,非對稱密鑰都有可能被破解。
由圖2的層級咱們還能夠看出,對稱密鑰不只僅能夠經過密碼建立,還能夠經過其它對稱密鑰,非對稱密鑰和證書建立。如代碼3所示。
--由證書加密對稱密鑰
CREATE SYMMETRIC KEY SymmetricByCert
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE CertTest;
GO
--由對稱密鑰加密對稱密鑰 OPEN SYMMETRIC KEY TestSymmetric DECRYPTION BY PASSWORD='pa$$word' CREATE SYMMETRIC KEY SymmetricBySy WITH ALGORITHM = AES_256 ENCRYPTION BY SYMMETRIC KEY TestSymmetric; GO --由非對稱密鑰加密對稱密鑰 CREATE SYMMETRIC KEY SymmetricByAsy WITH ALGORITHM = AES_256 ENCRYPTION BY ASYMMETRIC KEY TestASymmetric; GO
代碼3.由幾種不一樣的加密方式建立對稱密鑰
SQL Server在2005引入了列加密的功能。使得能夠利用證書,對稱密鑰和非對稱密鑰對特定的列進行加密。在具體的實現上,根據加密解密的方式不一樣,內置了4對函數用於加密解密:
所以,加密數據列使用起來相對比較繁瑣,須要程序在代碼中顯式的調用SQL Server內置的加密和解密函數,這須要額外的工做量,而且,加密或解密的列首先須要轉換成Varbinary類型。
下面咱們來看一個例子:
在AdventureWorks示例數據庫中,咱們找到Sales.CreditCard表,發現信用卡號是明文顯示的(怎麼AdventureWorks也像泄漏密碼的某IT網站這麼沒節操)。所以但願對這一列進行加密。
圖5.和國內某知名IT網站同樣沒節操的明文保存重要信息
首先咱們須要將CardNumber列轉爲Varbinary類型。這裏經過Select Into新建個表,如代碼4所示。
SELECT CreditCardID, CardType, CardNumber_encrypt = CONVERT(varbinary(500), CardNumber), ExpMonth, ExpYear, ModifiedDate INTO Sales.CreditCard_Encrypt FROM Sales.CreditCard WHERE 1<>1
代碼4.經過Select Into建立新表
此時咱們利用以前建立的由證書加密的對稱密鑰來進行列加密,如代碼5所示。
--打開以前建立的由證書加密的對稱密鑰
OPEN SYMMETRIC KEY SymmetricByCert
DECRYPTION BY CERTIFICATE CertTest
--利用這個密鑰加密數據並插入新建的表 insert Sales.CreditCard_encrypt ( CardType, CardNumber_encrypt, ExpMonth, ExpYear, ModifiedDate ) select top 10 CardType, CardNumber_encrypt = EncryptByKey(KEY_GUID('SymmetricByCert'), CardNumber), ExpMonth, ExpYear, ModifiedDate from Sales.CreditCard
代碼5.利用證書加密過的對稱密鑰加密數據
此時加密列沒法直接進行查看,如圖6所示:
圖6.沒法直接查看加密的列
此時能夠經過對應的解密函數查看數據,如代碼6所示。
OPEN SYMMETRIC KEY SymmetricByCert DECRYPTION BY CERTIFICATE CertTest select CardType, CardNumber = convert(nvarchar(25), DecryptByKey(CardNumber_encrypt)), ExpMonth, ExpYear, ModifiedDate from Sales.CreditCard_encrypt
圖6.由對應的解密函數查看加密的數據
所獲得的結果如圖7所示。
圖7.解密後結果能夠正確顯示
利用非對稱密鑰和證書進行加密解密只是函數不一樣,這裏就不測試了。
在SQL Server 2008中引入了透明數據加密(如下簡稱TDE),之因此叫透明數據加密,是由於這種加密在使用數據庫的程序或用戶看來,就好像沒有加密同樣。TDE加密是數據庫級別的。數據的加密和解密是以頁爲單位,由數據引擎執行的。在寫入時進行加密,在讀出時進行解密。客戶端程序徹底不用作任何操做。
TDE的主要做用是防止數據庫備份或數據文件被偷了之後,偷數據庫備份或文件的人在沒有數據加密密鑰的狀況下是沒法恢復或附加數據庫的。
TDE使用數據加密密鑰(DEK)進行加密。DEK是存在Master數據庫中由服務主密鑰保護,由的保護層級如圖8所示。
圖8.TDE的加密層次
開啓TDE的數據庫的日誌和備份都會被自動加密。
由於TDE使得數據庫在寫入時加密,在讀出時解密,所以須要額外的CPU資源,根據微軟的說法,須要額外3%-5%的CPU資源。
下面咱們來看如何開啓TDE
開啓TDE很是簡單,只需建立數據加密密鑰(DEK)後,將加密選項開啓就行,如代碼7所示。
--基於咱們以前建立的證書CertTest,建立DEK
--CertTest須要在Master數據庫中 USE AdventureWorks GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE CertTest GO --開啓TDE ALTER DATABASE AdventureWorks SET ENCRYPTION ON
代碼7.建立DEK後,開啓TDE
這裏值得注意的是,DEK是存在所開啓TDE的數據庫中的。固然,這個操做咱們也能夠經過在SSMS中右鍵點擊須要開始TDE的數據庫,選擇任務--管理數據庫加密來進行。如圖9所示。
圖9.在SSMS中開啓TDE
開啓TDE後,咱們能夠經過圖10的語句查看TDE的狀態。
圖10.查看數據庫加密狀態
本文介紹了加密的基本概念,SQL Server中加密的層級,以及SQL Server中提供的兩種不一樣的加密方式。SQL Server的TDE是一個很是強大的功能,在用戶程序中不作任何改變就能達到數據庫層面的安全。在使用SQL Server提供的加密技術以前,必定要先對加密的各個功能概念有一個系統的瞭解,不然頗有可能形成的後果是打不開數據庫。準備在後續文章中再寫關於證書,密鑰的備份和恢復….
轉自:http://www.cnblogs.com/CareySon/archive/2012/04/01/2428780.html