❶ MSSQL資料庫中有表用戶表USER,已知密碼「888」在表中對應的字元為「C6B9BDB9BDB9C7BCBCBDBDBC」。
數據加密是SQL Server 2005新增的數據安全特性,這對應用程序開發者來說是非常重要的改進。本文從程序開發者角度,探討SQL Server 2005數據加密特性以及如何運用該特性保證系統的數據安全。
SQL Server 2005是微軟開始實施其「可信賴計算」 計劃以來的第一個主要的產品,它提供了豐富的安全特性,為企業數據提供安全保障。對開發人員來說,最關注的是如何在程序設計過程中應用這些特性來保護資料庫中的數據安全。本文將從應用程序開發者角度探討基於SQL Server 2005數據加密特性的應用。
SQL Server 2005數據加密技術
數據用數字方式存儲在伺服器中並非萬無一失。實踐證明有太多的方法可以智取SQL Server 2000認證保護,最簡單的是通過使用沒有口令的sa賬號。盡管SQL Server 2005遠比它以前的版本安全,但攻擊者還是有可能獲得存儲的數據。因此,數據加密成為更徹底的數據保護戰略,即使攻擊者得以存取數據,還不得不解密,因而對數據增加了一層保護。
SQL Server 2000以前的版本沒有內置數據加密功能,若要在SQL Server 2000中進行數據加密,不得不買第三家產品,然後在伺服器外部作COM調用或者是在數據送伺服器之前在客戶端的應用中執行加密。這意味著加密的密鑰或證書不得不由加密者自己負責保護,而保護密鑰是數據加密中最難的事,所以即使很多應用中數據已被很強的加密過,數據保護仍然很弱。
SQL Server 2005通過將數據加密作為資料庫的內在特性解決了這個問題。它除了提供多層次的密鑰和豐富的加密演算法外,最大的好處是用戶可以選擇數據伺服器管理密鑰。SQL Server 2005伺服器支持的加密演算法如下:
⑴ 對稱式加密(Symmetric Key Encryption):
對稱式加密方式對加密和解密使用相同的密鑰。通常,這種加密方式在應用中難以實施,因為用同一種安全方式共享密鑰很難。但當數據儲存在SQL Server中時,這種方式很理想,你可以讓伺服器管理它。SQL Server 2005 提供RC4、RC2、DES 和 AES 系列加密演算法。
⑵ 非對稱密鑰加密(Asymmetric Key Encryption):
非對稱密鑰加密使用一組公共/私人密鑰系統,加密時使用一種密鑰,解密時使用另一種密鑰。公共密鑰可以廣泛的共享和透露。當需要用加密方式向伺服器外部傳送數據時,這種加密方式更方便。SQL Server 2005 支持 RSA 加密演算法以及 512 位、1,024 位和 2,048 位的密鑰強度。
⑶ 數字證書(Certificate):
數字證書是一種非對稱密鑰加密,但是,一個組織可以使用證書並通過數字簽名將一組公鑰和私鑰與其擁有者相關聯。SQL Server 2005 支持「網際網路工程工作組」(IETF) X.509 版本 3 (X.509v3) 規范。一個組織可以對 SQL Server 2005 使用外部生成的證書,或者可以使用 SQL Server 2005 生成證書。
SQL Server 2005 採用多級密鑰來保護它內部的密鑰和數據,如下圖所示:
圖1 SQL Server 2005採用多級密鑰保護它內部的密鑰和數據
圖中引出箭頭的密鑰或服務用於保護箭頭所指的密鑰。所以服務主密鑰(service master key)保護資料庫主密鑰(database master keys),而資料庫主密鑰又保護證書(certificates)和非對稱密鑰(asymmetric keys)。而最底層的對稱性密鑰(symmetric keys)被證書、非對稱密鑰或其他的對稱性密鑰保護(箭頭又指回它本身)。用戶只需通過提供密碼來保護這一系列的密鑰。
圖中頂層的服務主密鑰,安裝SQL Server 2005新實例時自動產生和安裝,用戶不能刪除此密鑰,但資料庫管理員能對它進行基本的維護,如備份該密鑰到一個加密文件,當其危及到安全時更新它,恢復它。
服務主密鑰由DPAPI(Data Protection API)管理。DPAPI在Windows 2000 中引入,建立於Windows的Crypt32 API之上。SQL Server 2005 管理與DPAPI的介面。服務主密鑰本身是對稱式加密,用來加密伺服器中的資料庫主密鑰。
資料庫主密鑰與服務主密鑰不同,在加密資料庫中數據之前,必須由資料庫管理員創建資料庫主密鑰。通常管理員在產生該密鑰時,提供一個口令,所以它用口令和服務主密鑰來加密。如果有足夠的許可權,用戶可以在需要時顯式地或自動地打開該密鑰。下面是產生資料庫主密鑰的T-SQL代碼示例:
以下為引用的內容:
USE EncryptionDB
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = 'UTY6%djzZ8S7RyL'
每個資料庫只有一個資料庫主密鑰。可以用ALTER MASTR KEY語句來刪除加密,更改口令或刪除資料庫主密鑰。通常這由資料庫管理員來負責做這些。
有了資料庫主密鑰,就可以著手加密數據。T-SQL有置於其內的加密支持。使用CREATE語句創建各種密碼,ALTER語句修改他們。例如要創建對稱式加密,可以通過一對函數EncryptByKey 和 DecryptByKey來完成。
數據加密技術應用解析
下面通過實例來探討SQL Server 2005數據加密與解密技術的實現。
假設有一張Customer 表,表中有欄位 customer ID、 name、 city 和各種信用卡細節。其中信用卡細節需要加密而其他數據不需要。假設User1有對稱式密鑰,並用該密鑰登錄,運行相應的代碼加密數據。
⑴ 數據加密
① 產生密鑰:在含有Customers 表的資料庫中使用Triple DES作為加密演算法,生成對稱式密鑰。本例中,密鑰本身由已經存在在資料庫中的證書保護,如圖一所示,對稱密碼受非對稱密碼和存在的其他對稱式密鑰保護。
以下為引用的內容:
CREATE SYMMETRIC KEY User1SymmetricKeyCert
AUTHORIZATION User1
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY CERTIFICATE User1Certificate
② 打開密鑰:對稱式密鑰使用前必須顯式打開,所以接下來打開它,重新找回密碼,解密它,並放它在受保護的伺服器內存中,准備使用。
以下為引用的內容:
OPEN SYMMETRIC KEY User1SymmetricKeyCert
DECRYPTION BY CERTIFICATE User1Certificate
③ 加密數據:在下面的代碼中,使用正常的T-SQL INSERT語句將一行數據插入表中,id、name和city 用明文保存,信用卡類型、號碼以及有潛在機密的客戶注釋用加密方式儲存,用Triple DES加密演算法加密數據。
以下為引用的內容:
INSERT INTO Customer
VALUES (4, 'John Doe', 'Fairbanks',
EncryptByKey(Key_GUID(
'User1SymmetricKeyCert'), 'Amex'),
EncryptByKey(Key_GUID(
'User1SymmetricKeyCert'),
'1234-5678-9009-8765'),
EncryptByKey(Key_GUID(
'User1SymmetricKeyCert'),
'Window shopper. Spends $5 at most.'))
加密完成後,關閉它,釋放內存,以防它被誤用。
CLOSE SYMMETRIC KEY User1SymmetricKeyCert
以上是整個的數據加密的操作過程。它沒有混亂的密碼管理,也不用調用特別的演算法。儲存加密數據的欄位是varbinary類型數據,其長度足以儲存擴展的數據(加密數據比明文需要更多的空間,有時候多很多)。
⑵ 數據解密
要解密已加密的數據,你需要重新打開對稱式加密。使用DecryptByKey函數讀數據,然後關閉對稱式加密。結果及相應的代碼如下。
以下為引用的內容:
OPEN SYMMETRIC KEY User1SymmetricKeyCert
DECRYPTION BY CERTIFICATE User1Certificate
SELECT CustID, Name, City,
CONVERT(VARCHAR, DecryptByKey(CreditCardType))
AS CardType,
CONVERT(VARCHAR, DecryptByKey(CreditCardNumber))
AS CardNumber,
CONVERT(VARCHAR, DecryptByKey(Notes))
AS Notes
FROM Customer WHERE CustID = 4
CLOSE
這個例子顯示了讓SQL Server 2005為你管理密鑰的一種方法。但實際上,用戶總是選擇自己提供一個口令的方式,用RC4演算法產生對稱密碼。代碼如下:
以下為引用的內容:
CREATE SYMMETRIC KEY User2SymmetricKeyPwd
AUTHORIZATION User2
WITH ALGORITHM = RC4
ENCRYPTION BY PASSWORD = 'sdylvxF&imeG3FP'
SQL Server 2005產生一個基於用戶提供的口令的密鑰來加密數據。除非明確指定,否則口令不保存在SQL Server 2005中,用戶必須保護好自己的口令,否則任何一個知道口令的人都可以解密數據。
如果認為對存儲在資料庫中的數據加密完全是浪費處理器時間和存儲空間那就錯了。SQL Server 2005中的數據加密是一個非凡的特性,它為客戶的數據提供了一個重要的保護層。但應用時要注意,只對那些敏感機密的數據進行保護,因為加密消耗伺服器處理器大量的資源,如果對一個有一千萬條記錄的表的每個欄位都加密的話,運行一條沒有Where 子句的SELECT 就可能導致伺服器性能的崩潰。