簡介
加密是指通過使用密鑰或密碼對數據進行模糊處理的過程。在SQL Server中,加密並不能替代其他的安全設置,比如防止未被授權的人訪問數據庫或是數據庫實例所在的Windows系統,甚至是數據庫所在的機房,而是作為當數據庫被破解或是備份被竊取後的最後一道防線。通過加密,使得未被授權的人在沒有密鑰或密碼的情況下所竊取的數據變得毫無意義。這種做法不僅僅是為了你的數據安全,有時甚至是法律所要求的(像國內某知名IT網站洩漏密碼這種事在中國可以道歉後不負任何責任了事,在米國妥妥的要破產清算)。
SQL Server中的加密簡介
在SQL Server2000和以前的版本,是不支持加密的。所有的加密操作都需要在程序中完成。這導致一個問題,數據庫中加密的數據僅僅是對某一特定程序有意義,而另外的程序如果沒有對應的解密算法,則數據變得毫無意義。
到了SQL Server2005,引入了列級加密。使得加密可以對特定列執行,這個過程涉及4對加密和解密的內置函數
SQL Server 2008時代,則引入的了透明數據加密(TDE),所謂的透明數據加密,就是加密在數據庫中進行,但從程序的角度來看就好像沒有加密一樣,和列級加密不同的是,TDE加密的級別是整個數據庫。使用TDE加密的數據庫文件或備份在另一個沒有證書的實例上是不能附加或恢復的。
加密的一些基礎知識
加密是指通過使用密鑰或密碼對數據進行模糊處理的過程。加密解密最簡單的過程如圖1所示。
圖1.一個簡單的加密解密過程
通常來說,加密可以分為兩大類,對稱(Symmetric)加密和非對稱(Asymmetric)加密。
對稱加密是那些加密和解密使用同一個密鑰的加密算法,在圖1中就是加密密鑰=解密密鑰。對稱加密通常來說會比較羸弱,因為使用數據時不僅僅需要傳輸數據本身,還是要通過某種方式傳輸密鑰,這很有可能使得密鑰在傳輸的過程中被竊取。
非對稱加密是那些加密和解密使用不同密鑰的加密算法,在圖1中就是加密密鑰!=解密密鑰。用於加密的密鑰稱之為公鑰,用於解密的密鑰稱之為私鑰。因此安全性相比對稱加密來說會大大提高。當然有一長必有一短,非對稱加密的方式通常算法會相比對稱密鑰來說復雜許多,因此會帶來性能上的損失。
因此,一種折中的辦法是使用對稱密鑰來加密數據,而使用非對稱密鑰來加密對稱密鑰。這樣既可以利用對稱密鑰的高性能,還可以利用非對稱密鑰的可靠性。
加密算法的選擇
現在流行的很多加密算法都是工業級的,比如對稱加密的算法有:DES、3DES、IDEA、FEAL、BLOWFISH.而非對稱加密的算法比如經典的RSA。因為這些算法已經公布了比較長的時間,並且經受了很多人的考驗,所以通常來說都是比較安全的。 www.2cto.com
SQL Server提供了比如:DES、Triple DES、TRIPLE_DES_3KEY、RC2、RC4、128 位 RC4、DESX、128 位 AES、192 位 AES 和 256 位 AES這些加密算法,沒有某種算法能適應所有要求,每種算法都有長處和短處,關於每種加密算法的細節,請Bing…
但選擇算法有一些共通之處:
強加密通常會比較弱的加密占用更多的 CPU 資源。
長密鑰通常會比短密鑰生成更強的加密。
非對稱加密比使用相同密鑰長度的對稱加密更強,但速度相對較慢。
使用長密鑰的塊密碼比流密碼更強。
復雜的長密碼比短密碼更強。
如果您正在加密大量數據,應使用對稱密鑰來加密數據,並使用非對稱密鑰來加密該對稱密鑰。
不能壓縮已加密的數據,但可以加密已壓縮的數據。如果使用壓縮,應在加密前壓縮數據。
SQL Server中的加密層次結構
在SQL Server中,加密是分層級的.根層級的加密保護其子層級的加密。概念如圖2所示。
圖2.SQL Server加密的層級
由圖2可以看出,加密是分層級的。每一個數據庫實例都擁有一個服務主密鑰(Service Master Key),對應圖2中的橙色部分。這個密鑰是整個實例的根密鑰,在實例安裝的時候自動生成,其本身由Windows提供的數據保護API進行保護(Data Pertection API),服務主密鑰除了為其子節點提供加密服務之外,還用於加密一些實例級別的信息,比如實例的登錄名密碼或者鏈接服務器的信息。
在服務主密鑰之下的是數據庫主密鑰(Database Master Key),也就是圖2中土黃色的部分,這個密鑰由服務主密鑰進行加密。這是一個數據庫級別的密鑰。可以用於為創建數據庫級別的證書或非對稱密鑰提供加密。每一個數據庫只能有一個數據庫主密鑰,通過T-SQL語句創建,如代碼1所示。
CREATE MASTER KEY ENCRYPTION BY PASSWORD ='Pa$$word'
代碼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所示。