2013年4月的某一天,我接到客戶的電話,反映網(wǎng)絡(luò)部發(fā)現(xiàn)有黑客進(jìn)入到財(cái)政資產(chǎn)系統(tǒng),由于發(fā)現(xiàn)的比較及時(shí),黑客對(duì)數(shù)據(jù)庫的文件拷貝沒有完成。由于資產(chǎn)系統(tǒng)可以反映一些比較敏感的信息,客戶對(duì)此十分擔(dān)心,需要網(wǎng)絡(luò)部門和系統(tǒng)開發(fā)商提出相關(guān)技術(shù)來解決信息被竊取的問題。經(jīng)過討論,我們認(rèn)為對(duì)數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行加密是較好的解決方案,這樣做的好處是,即使文件被竊取,黑客也無法恢復(fù)數(shù)據(jù)。雙機(jī)熱備軟件(http://www.expresscluster.net.cn/)
該系統(tǒng)采用Java開發(fā),后臺(tái)采用的數(shù)據(jù)庫為Oracle 11Gr2,操作系統(tǒng)為L(zhǎng)inux x86-64。Oracle和第三方公司提供了一些可以抽取數(shù)據(jù)文件內(nèi)容的工具,這些工具的設(shè)計(jì)初衷是為解決一些故障案例,但也很容易被一些人用于竊取數(shù)據(jù)信息。
在Oracle數(shù)據(jù)庫中,除去數(shù)據(jù)文件本身,redo、undo也可以恢復(fù)一些數(shù)據(jù),因此這些文件都需要進(jìn)行加密。在這個(gè)過程中,我們可以自己通過手工的方式對(duì)數(shù)據(jù)進(jìn)行加密,把加密的過程寫在應(yīng)用中,不要把加密的信息放在數(shù)據(jù)庫的表中。在應(yīng)用中進(jìn)行加密,需要對(duì)代碼進(jìn)行保護(hù),防止代碼被竊取從而導(dǎo)致密鑰被破解,代碼封裝要進(jìn)行嚴(yán)格設(shè)計(jì)。
Oracle在加密技術(shù)上引入了wallet的技術(shù),加密后需要數(shù)據(jù)文件和密碼同時(shí)具備才可以訪問數(shù)據(jù)庫。在一些比較敏感的列上,可以采用列加密的技術(shù)保護(hù)數(shù)據(jù),一旦被加密列上的數(shù)據(jù)塊被訪問時(shí),這個(gè)列就會(huì)被加密,與這個(gè)列相關(guān)的redo、undo、temp數(shù)據(jù)也會(huì)加密。這個(gè)技術(shù)在數(shù)據(jù)庫中非常容易實(shí)現(xiàn),建立好wallet后,在建立表的過程中添加ENCRYPT就可以,操作如下:
Create table test
(id number(10),
Name varchar2(10) ENCRYPT)
假設(shè)我們的數(shù)據(jù)庫文件被竊取,在訪問的時(shí)候就會(huì)有ORA-28365 wallet is not open的錯(cuò)誤。如果直接去抽取數(shù)據(jù)文件,看到的也是經(jīng)過加密后的亂碼信息。列加密可以很好的保護(hù)我們的數(shù)據(jù),當(dāng)然也會(huì)帶來一些性能影響,需要綜合來考慮。
除列級(jí)的加密技術(shù)之外,Oracle也提供了在表空間級(jí)別進(jìn)行透明加密。一旦表空間被加密,存儲(chǔ)在表空間中的各個(gè)數(shù)據(jù)塊都將加密,每一個(gè)數(shù)據(jù)塊中的每一個(gè)數(shù)據(jù)字節(jié)都會(huì)被加密,這樣就可以很好的保護(hù)數(shù)據(jù)。表空間加密的技術(shù)實(shí)現(xiàn)是在創(chuàng)建表空間的語句后面添加上ENCRYPTION DEFAULT STORAGE(ENCRYPT)來實(shí)現(xiàn),實(shí)現(xiàn)非常簡(jiǎn)單,而且在性能問題上帶來的負(fù)面效果也比列加密要小。遠(yuǎn)程容災(zāi)(http://www.expresscluster.net.cn/)
除了在數(shù)據(jù)庫級(jí)別采用一些加密技術(shù)手段,在網(wǎng)絡(luò)方面也需要嚴(yán)加控制,防止黑客的入侵,Oracle也提供了一些防火墻的技術(shù)來解決安全問題。