Oracle網絡傳輸的加密和完整性驗證
轉自 http://blog.itpub.net/24052272/viewspace-2129175/
測試環境:
11.2.0.4 winodows 單機
應用場景:
對oracle服務器和客戶端之間的網絡傳輸數據進行加密和完整性校驗。
默認是使用明文方式傳輸數據,舉例可以通過wireshark、sniffer等網絡抓包工具抓取到傳輸的具體信息。
對於敏感信息是很不安全的。
舉例:
對於漢字可以通過很多在線轉換工具將HEX編碼轉換成可讀漢字。
對於了解業務的人來說,這些信息是很有價值的。
客戶端存在兩種模式:
1、通過oracle客戶端軟件連接數據庫
2、通過jdbc驅動連接oracle數據庫
通過oracle客戶端的情況:
啟用傳輸加密和校驗的主要方法是通過服務器端和客戶端的sqlnet.ora文件實現。
配置方法:
理論上需要在數據庫server端和oracle客戶端都修改sqlnet.ora文件,但因為client端默認傳輸加密級別是ACCEPTED,默認一致性校驗級別是ACCEPTED,所以只需要在服務器端設置如下參數就可以打開傳輸加密和一致性校驗功能,而不需要再對client端的sqlnet.ora進行設置(知識拓展部分介紹)。
在oracle服務器端編輯sqlnet.ora文件,添加參數:
SQLNET.ENCRYPTION_SERVER = REQUIRED ----加密級別
SQLNET.ENCRYPTION_TYPES_SERVER = RC4_256 ----加密算法
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED --- 一致性能校驗
設置參數後對新建立的session起作用。
加密後抓取的包不再是明文的:
對於jdbc連接的情況:
需要寫代碼,不是很懂,不做驗證,大體格式如下:
For example:
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Properties props = new Properties(); props.put("oracle.net.encryption_client", "accepted"); props.put("oracle.net.encryption_types_client", "RC4_128");
props.put("oracle.net.crypto_checksum_client", "REQUIRED"); //此行根據官方文檔寫,未作驗證
props.put("oracle.net.crypto_checksum_types_client","MD5"); //此行根據官方文檔格式寫,未作驗證
props.put("user", "XXX"); props.put("password", "YYY"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@myhost:1521:mySID", props);
知識拓展:
server端和client端的加密級別參數SQLNET.ENCRYPTION_SERVER|CLIENT
級別分
-
REQUESTED
-
REQUIRED
-
ACCEPTED
-
REJECTED
server和client 要配合使用才能確保進行傳輸加密,簡單概括如下表格:
Table 4-2 Encryption and Data Integrity Negotiations
Client Setting | Server Setting | Encryption and Data Negotiation |
---|---|---|
REJECTED |
REJECTED |
OFF |
ACCEPTED |
REJECTED |
OFF |
REQUESTED |
REJECTED |
OFF |
REQUIRED |
REJECTED |
Connection fails |
REJECTED |
ACCEPTED |
OFF |
ACCEPTED |
ACCEPTED |
OFFFoot 1 |
REQUESTED |
ACCEPTED |
ON |
REQUIRED |
ACCEPTED |
ON |
REJECTED |
REQUESTED |
OFF |
ACCEPTED |
REQUESTED |
ON |
REQUESTED |
REQUESTED |
ON |
REQUIRED |
REQUESTED |
ON |
REJECTED |
REQUIRED |
Connection fails |
ACCEPTED |
REQUIRED |
ON |
REQUESTED |
REQUIRED |
ON |
REQUIRED |
REQUIRED |
ON |
一致性校驗也分四中級別:
SQLNET.CRYPTO_CHECKSUM_SERVER|CLIENT
-
REQUESTED
-
REQUIRED
-
ACCEPTED
-
REJECTED
同樣需要配合使用。
參數解釋:
SQLNET.CRYPTO_CHECKSUM_CLIENT。默認設置為ACCEPTED。
參數
ACCEPTED - 客戶端不請求使用校驗和,但是如果服務器請求校驗和,則請求。兼容的服務器參數為REJECTED,REQUESTED和REQUIRED。
REJECTED - 客戶端不支持使用校驗和。兼容的服務器參數為REJECTED,ACCEPTED和REQUESTED。
REQUESTED - 客戶端喜歡使用校驗和,但是如果服務器拒絕它們的使用,則不強制該問題。兼容的服務器參數是ACCEPTED,REQUESTED和REQUIRED。
REQUIRED - 客戶端要求使用校驗和,否則不連接。兼容的服務器參數是ACCEPTED,REQUESTED和REQUIRED。
SQLNET.CRYPTO_CHECKSUM_SERVER。默認設置為ACCEPTED。
參數
ACCEPTED - 服務器不請求使用校驗和,但如果客戶端請求它們,請繼續。兼容的服務器參數有:REJECTED,REQUESTED和REQUIRED。
REJECTED - 服務器根本不支持使用校驗和。兼容的客戶端參數為REJECTED,ACCEPTED和REQUESTED。
REQUESTED - 服務器更喜歡使用校驗和,但是如果客戶端拒絕它們的使用,則不強制該問題。兼容的客戶端參數是ACCEPTED,REQUESTED和REQUIRED。
REQUIRED - 服務器要求使用校驗和,否則不連接。兼容的客戶端參數是ACCEPTED,REQUESTED和REQUIRED。
對性能的影響:
既然要 加密和解密就勢必會占用一定的性能資源,但影響不大,下圖是一個測試結果,摘自http://www.orafaq.com/wiki/Network_Encryption
Algorithm | None | MD5 | SHA-1 | |||
---|---|---|---|---|---|---|
Time | %None | Time | %None | Time | %None | |
None | 79.6 s | 80.5 s | 101% | 82.4 s | 104% | |
DES | 104.7 s | 132% | 107.1 s | 135% | 108.2 s | 136% |
3DES168 | 151.8 s | 191% | 153.9 s | 193% | 155.6 s | 196% |
AES128 | 88.8 s | 112% | 90.5 s | 114% | 92.1 s | 116% |
AES256 | 91.8 s | 115% | 93.5 s | 117% | 94.2 s | 118% |
RC4_128 | 81.6 s | 103% | 82.5 s | 104% | 85.0 s | 107% |
RC4_256 | 81.7 s | 103% | 82.8 s | 104% | 85.0 s | 107% |
參考文檔:
http://docs.oracle.com/cd/B19306_01/network.102/b14268/asoconfg.htm#BBJBIECD
http://docs.oracle.com/cd/B19306_01/network.102/b14268/asojbdc.htm#i1006209
http://www.orafaq.com/wiki/Network_Encryption
http://www.toadworld.com/platforms/oracle/w/wiki/1719.sqlnet-ora-parameters
Oracle網絡傳輸的加密和完整性驗證