由于Oracle數(shù)據(jù)庫(kù)被廣泛應(yīng)用,其口令加密算法也是備受關(guān)注。最早在1993年comp.databases.oracle.server新聞組中有人披露了加密算法的大部分細(xì)節(jié)。十年后,一本名為《Special Ops Host and Network Security for Microsoft, Unix and Oracle》的書(shū)中補(bǔ)全了算法最重要的一個(gè)環(huán)節(jié)——DES算法的KEY。至此,口令加密算法已無(wú)秘密可言。接踵而來(lái)的是互聯(lián)網(wǎng)上出現(xiàn)多個(gè)了Oracle口令破解工具。Oracle在2007年推出的最新版本11g中,使用了新的更安全的加密算法,但是新算法的細(xì)節(jié)很快又在互聯(lián)網(wǎng)上被公開(kāi)。為提供兼容,11g版本保留了11g以前版本使用的加密口令,利用這一漏洞仍然可以對(duì)11g版本的加密口令進(jìn)行破解。
專注于為中小企業(yè)提供網(wǎng)站制作、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)伊寧免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
到底怎樣才能保證數(shù)據(jù)庫(kù)口令的安全呢?本文首先介紹Oracle數(shù)據(jù)庫(kù)各版本口令加密算法的內(nèi)容,然后針對(duì)算法重點(diǎn)介紹加強(qiáng)數(shù)據(jù)庫(kù)安全性的應(yīng)對(duì)措施。
口令加密算法
從Oracle7到Oracle 10gR2,使用DES算法對(duì)口令進(jìn)行加密。對(duì)算法進(jìn)行分析,可以得出如下結(jié)論:口令不區(qū)分大小寫(xiě),任意大小寫(xiě)組合均可登錄;由于只使用固定KEY,只要用戶名和口令相同,在任一DB中存放的加密口令都相同;由于采用了用戶名和口令串接的方式,所以用戶aaa、口令bbbccc的加密值與用戶aaabbb、口令ccc完全相同。
Oracle 11g版本的加密口令存放在SYS.USER$表中的SPARE4列中,而PASSWORD列中仍保留以前版本加密口令。由于客戶端計(jì)算加密口令需要用到SALT,在建立連接時(shí),服務(wù)器端將SALT明文傳送給客戶端程序。Oracle 11g中新的口令加密算法中區(qū)分大小寫(xiě);由于加入了隨機(jī)數(shù)SALT,兩個(gè)不同用戶的口令即便完全相同,計(jì)算得到的SHA1的散列值也不同;不同DB中相同用戶相同口令,SHA1散列值也可能不同。
目前,大多數(shù)破解工具的工作方式是得到加密口令后,對(duì)每一個(gè)可能的口令進(jìn)行加密計(jì)算,比較計(jì)算結(jié)果而確定是否正確。由此,抵御口令破解可以從三個(gè)方面著手:防止加密口令外泄;在加密口令落入黑客手中后,口令也是不可破解的,或盡量增加破解的時(shí)間;即便是口令被破解,也是無(wú)用的,不能存取數(shù)據(jù)庫(kù)。
防止加密口令泄露
1.應(yīng)用“最少權(quán)限”原則,盡量限制可存取加密口令用戶的人數(shù)
在數(shù)據(jù)庫(kù)中檢查具有存取SYS.USER$或DBA_USERS權(quán)限的用戶,并從不需要的用戶中收回權(quán)限。但是操作并不簡(jiǎn)單,這也是數(shù)據(jù)庫(kù)管理工作的特點(diǎn)。每一廠商的軟件中都實(shí)現(xiàn)了SQL標(biāo)準(zhǔn)之外的擴(kuò)充,并且每一版本都有差異。限于篇幅,不可能對(duì)所有本文中建議的措施進(jìn)行詳細(xì)的解釋說(shuō)明,僅以此處檢查權(quán)限為例展示DBA工作的復(fù)雜性。本文中如未說(shuō)明,則默認(rèn)版本為11g。應(yīng)用于11g以前版本時(shí),請(qǐng)讀者確認(rèn)是否需要修改。
檢查權(quán)限主要的工具是數(shù)據(jù)字典視圖(也可以直接存取SYS用戶的基表,但基表的定義沒(méi)有公布,官方不提供技術(shù)支持)。視圖DBA_TAB_PRIVS存放了數(shù)據(jù)庫(kù)中數(shù)據(jù)對(duì)象上的授權(quán)信息。假定用戶A1和A2可以存取SYS.USER$表,檢查在SYS用戶USER$上有存取權(quán)限的用戶,可執(zhí)行如下語(yǔ)句:
SELECT GRANTEE FROM DBA_TAB_PRIVS WHERE TABLE_NAME=‘USER$’;
我們已經(jīng)知道用戶A1和A2,都可以存取SYS.USER$表,但為什么在上面查詢結(jié)果中沒(méi)有出現(xiàn)呢?這是因?yàn)樵贠racle的權(quán)限管理中,對(duì)一個(gè)表的存取權(quán)限還可以通過(guò)系統(tǒng)權(quán)限或角色賦予,而DBA_TAB_PRIVS中僅列出了直接的對(duì)象權(quán)限的授予信息。對(duì)于SYS.USER$表而言,系統(tǒng)權(quán)限SELECT ANY DICTIONARY和角色DBA都包含了這一表的存取權(quán)限。所以完整列出所有可存取這一表的用戶應(yīng)增加下面兩條查詢語(yǔ)句的結(jié)果:
SELECT GRANTEE FROM DBA_SYS_PRIVS WHERE PRIVILEGE=‘SELECT ANY DICTIONARY’;
SELECT GRANTEE FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE=‘DBA’;
通過(guò)上面的查詢語(yǔ)句,還是會(huì)遺漏某些用戶。如果把DBA角色授權(quán)給另一角色Admin,然后又將Admin角色授權(quán)給另一用戶NEWU,則此用戶可存取SYS.USER$表,但在上述三個(gè)查詢中并沒(méi)有直接列出NEWU的名字(角色Admin會(huì)出現(xiàn)在第三個(gè)查詢語(yǔ)句的結(jié)果中)。
顯然,Oracle的授權(quán)構(gòu)成了一棵樹(shù),完整的信息需要一段PL/SQL程序來(lái)完成。(對(duì)于11g以前版本,還需要檢查對(duì)DBA_USERS視圖有存取權(quán)限的用戶和角色。SELECT_CATALOG_ROLE角色如被授權(quán),則可以存取所有數(shù)據(jù)字典視圖,但不能存取SYS的基表。)
2.設(shè)定對(duì)加密口令存取的審計(jì)
如果當(dāng)前系統(tǒng)中只有SYSDBA可以存取USER$,則一個(gè)變通辦法是審計(jì)SYSDBA的所有操作,其中也包括對(duì)USER$的存取。設(shè)置初始化參數(shù)audit_sys_operations =TRUE,重新啟動(dòng)數(shù)據(jù)庫(kù)后激活對(duì)SYSDBA操作的審計(jì)。
審計(jì)文件的存放位置為:
11g版本中為:$ORACLE_BASE/admin/SID/ adump/ *.a(chǎn)ud
11g以前版本為: $ORACLE_HOME/rdbms/audit/ *.a(chǎn)ud。
嚴(yán)格限制和監(jiān)視SYSDBA用戶活動(dòng)的最好辦法是使用Oracle Database Vault組件。
3.在操作系統(tǒng)級(jí)限制對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)文件的存取
SYSDBA用戶的加密口令存放在$ORACLE_HOME/dbs下的口令文件orapw〈SID〉中。SYS.USER$表同樣需要在數(shù)據(jù)文件中存放,多數(shù)為SYSTEM表空間的第一個(gè)數(shù)據(jù)文件中。此外,EXPORT文件、REDOLOG文件以及TRACE文件中都可能出現(xiàn)加密口令。需要嚴(yán)格限制上述文件的存取權(quán)限。
4.防止網(wǎng)絡(luò)竊聽(tīng)
在建立連接時(shí),客戶端需要向服務(wù)器端傳送用戶名和口令,并且服務(wù)器端與客戶端需要相互發(fā)送這次會(huì)話使用的SESSION KEY。Oracle采用Diffie-Hellman KEY交換算法和自己開(kāi)發(fā)的O3LOGON協(xié)議完成上述任務(wù)。算法的細(xì)節(jié)同樣已在互聯(lián)網(wǎng)上被公開(kāi)。建立連接時(shí)上述信息如果被截獲,同樣可以被用來(lái)破解口令。更為嚴(yán)重的是,如果黑客事先已經(jīng)獲得加密口令,結(jié)合SESSION KEY的信息,則不需要任何破解,執(zhí)行簡(jiǎn)單還原運(yùn)算就可算出口令明文。
另外,設(shè)計(jì)SID時(shí)不要使用如ORCL、TEST、PROD等常用名字,設(shè)定PORT號(hào)為遠(yuǎn)遠(yuǎn)大于1521的數(shù),都可以增加黑客SID掃描的難度和時(shí)間。
5. 刪除舊版的加密口令
存放在Oracle 11g數(shù)據(jù)庫(kù)中的以前版本的加密口令是口令破解工具的一個(gè)突破口。在沒(méi)有兼容性限制的系統(tǒng)中,可以考慮從系統(tǒng)中刪除舊版口令,從而增加破解難度。
具體操作如下:
在SQLNET.ORA中增加一行:SQLNET.ALLOWED_LOGON_VERSION=11(Oracle手冊(cè)中格式介紹有錯(cuò)誤,不能加括號(hào):…=(11)),指定最低版本。
以SYSDBA登錄后,執(zhí)行以下語(yǔ)句,刪除舊版口令。
update sys.user$ set password=NULL;
delete from user_history$;
commit;
設(shè)置修改后,基于OCI的工具如SQLPLUS、10gR1和10gR2版本都可以正常登錄,而JDBC type-4 則只有11g版本才允許登錄。
提高口令強(qiáng)度
1.禁止使用缺省口令,禁止與用戶名同名的口令,禁止字典詞匯的口令
Oracle 11g中提供一個(gè)視圖DBA_USERS_WITH_DEFPWD,可以方便地查出系統(tǒng)中使用缺省口令的所有用戶,不足的是還有不少遺漏。讀者可以在互聯(lián)網(wǎng)找到缺省口令的列表,雖然是非官方的,但是比DBA_USERS_WITH_DEFPWD使用的官方的列表更全。破解工具附帶的詞匯表有的包括了大型英文詞典中全部詞匯,并支持詞匯與“123”之類的常用后綴進(jìn)行組合。需要注意的是,有的詞匯表中已經(jīng)出現(xiàn)了“zhongguo”這樣的字符串,所以漢語(yǔ)拼音組成的口令也是不安全的。檢查系統(tǒng)中是否存在弱口令的最常用方法就是使用前述口令破解工具進(jìn)行攻擊。
2.規(guī)定口令最小字符集和口令最短長(zhǎng)度
口令字符集最小應(yīng)包括字母、數(shù)字和特殊符號(hào),口令長(zhǎng)度最短應(yīng)不少于8位,對(duì)于安全性要求高的系統(tǒng),最短長(zhǎng)度應(yīng)為12位以上。同樣,問(wèn)題的關(guān)鍵在于DBA指定初始口令以及用戶修改口令時(shí)保證不違反上述這些規(guī)定。每一用戶都對(duì)應(yīng)一個(gè)Profile,如在Profile中指定口令驗(yàn)證函數(shù),則每當(dāng)創(chuàng)建或修改口令時(shí),會(huì)自動(dòng)檢查是否滿足驗(yàn)證程序中所設(shè)定的條件,如果不滿足,則口令修改失敗。對(duì)口令明文進(jìn)行檢查,顯然要比對(duì)加密口令破解效率高。此外,口令創(chuàng)建之時(shí)進(jìn)行檢查可以及時(shí)封殺弱口令,不給黑客留下破解的窗口。
指定口令驗(yàn)證函數(shù)的語(yǔ)句為:
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION 口令驗(yàn)證函數(shù)名;
上例中,為“DEFAULT” Profile指定了驗(yàn)證函數(shù)。對(duì)用戶進(jìn)行分類后,應(yīng)當(dāng)為每一類用戶分別創(chuàng)建自己的Profile,而不是全部使用DEFAULT。關(guān)閉口令驗(yàn)證函數(shù)的語(yǔ)句為:
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;
在$ORACLE_HOME/rdbms/admin/下,腳本文件UTLPWDMG.SQL提供了示例的口令驗(yàn)證函數(shù),執(zhí)行這一腳本,將創(chuàng)建一名為VERIFY_FUNCTION的函數(shù)( Oracle 11g中,增加新函數(shù)verify_function_11G )。這一函數(shù)可以對(duì)口令長(zhǎng)度是否同時(shí)出現(xiàn)了字母數(shù)字符號(hào)進(jìn)行檢查,檢查是否與用戶名同名,也檢查口令是否是幾個(gè)最常用的詞匯,如welcome、database1、account1等。最后,口令修改時(shí)檢查新舊口令是否過(guò)于相似。讀者實(shí)際使用時(shí)應(yīng)該根據(jù)系統(tǒng)需要對(duì)這一函數(shù)進(jìn)行必要的修改和擴(kuò)充。
3.使用易記憶的隨機(jī)口令限定口令長(zhǎng)度后,如果口令沒(méi)有規(guī)律很難記憶,則用戶會(huì)采用他們自己的方式記住口令,大大增加了遭受社會(huì)工程攻擊的可能性。DBA需要幫助用戶設(shè)計(jì)一個(gè)容易記憶而又不易破解的口令。一個(gè)簡(jiǎn)單易行的方法是找用戶非常熟悉的一個(gè)句子,如One world One dream,然后將每一個(gè)空格替換為數(shù)字或符號(hào):One3world2One1dream#。
定期更換口令
抵御口令破解要從多方面著手
數(shù)據(jù)庫(kù)中存在多種權(quán)限用戶,各種授權(quán)用戶構(gòu)成一棵樹(shù)
應(yīng)對(duì)口令泄露或被破解的措施是強(qiáng)制定期更換口令,設(shè)定口令重復(fù)使用限制,規(guī)定封鎖口令的錯(cuò)誤次數(shù)上限及封鎖時(shí)間。即便是加密口令落入黑客手中,在被破解之前或入侵之前,修改了口令,則口令破解變得毫無(wú)意義。為了方便記憶,一般用戶有重新使用之前過(guò)期口令的傾向,如果對(duì)重用不加控制,則定期更換口令將失去意義。上述對(duì)口令的管理仍然是通過(guò)Profile完成:
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 30
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 0
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION my_verify_function;
上面語(yǔ)句制定的口令管理政策為:口令的有效期為30天,隨后有7天的寬限期,寬限期后口令“過(guò)期”,必須更改口令后才能登錄。只有經(jīng)過(guò)365天后才能重新使用以前的口令。在連續(xù)10次輸入口令錯(cuò)誤后,賬號(hào)被封鎖,設(shè)定不自動(dòng)解鎖,必須由DBA手動(dòng)解除封鎖。口令驗(yàn)證函數(shù)為my_verify_function。
Oracle 11g以前版本,缺省設(shè)置中沒(méi)有設(shè)定口令的有效期,而在Oracle 11g中缺省設(shè)置有效期為180天。程序中直接寫(xiě)入口令的應(yīng)用在升級(jí)到11g時(shí)一定要注意有效期問(wèn)題,避免半年后應(yīng)用突然無(wú)法自動(dòng)運(yùn)行。另外,口令的有效期對(duì)SYS用戶不起作用,DBA一定要主動(dòng)定期更換口令。
另外一個(gè)措施是對(duì)登錄數(shù)據(jù)庫(kù)服務(wù)器的主機(jī)進(jìn)行限定,如指定網(wǎng)段或指定IP地址。進(jìn)一步限定客戶端允許執(zhí)行的程序,如對(duì)非本地登錄禁止使用SQLPLUS,只允許執(zhí)行某特定應(yīng)用。
認(rèn)真實(shí)施本文中給出的措施后,可以很有效地防止口令被破解。然而我們的目的是提高數(shù)據(jù)庫(kù)系統(tǒng)的安全性,而不僅僅是保證口令不被破解。數(shù)據(jù)庫(kù)系統(tǒng)安全的任何一個(gè)環(huán)節(jié)出現(xiàn)問(wèn)題,都會(huì)導(dǎo)致前功盡棄。黑客的目的是入侵系統(tǒng)盜竊數(shù)據(jù),是不會(huì)按常理出牌的,會(huì)嘗試各種手段方式,如社會(huì)工程、安全漏洞、物理入侵等等,而不會(huì)執(zhí)著地在口令破解上與我們較勁。這一點(diǎn)需要我們經(jīng)常提醒自己,從而切實(shí)保證數(shù)據(jù)庫(kù)系統(tǒng)安全。
TechTarget中國(guó)原創(chuàng)內(nèi)容
可以例用Oracle
自帶的Wrap工具實(shí)現(xiàn),此工具在$ORACLE_HOME/BIN目錄下,具體如下
1、設(shè)置字符集環(huán)境變量
set
NLS_LANG=CHINESE_CHINA.ZHS16GBK
2、創(chuàng)建一個(gè)存儲(chǔ)過(guò)程文件
在E:\下創(chuàng)建test.sql文件,內(nèi)容如下:
create
or
replace
procedure
test1(i
in
number)
as
begin
dbms_output.put_line('
輸入?yún)?shù)是'||to_char(i));
end;
3、加密
c:\
cd
%ORACLE_HOME%\BIN
c:\wrap
iname=e:\test1.sql
PL/SQL
Wrapper:
Release
8.1.7.0.0
-
Production
on
Tue
Nov
27
22:26:48
2001
Copyright
(c)
Oracle
Corporation
1993,
2000.All
Rights
Reserved.
Processing
test1.sql
to
test1.plb
4、運(yùn)行test1.plb
sqlplus
/nolog
SQLconn
TEST/TEST@db01
SQL
@e:\a.plb
過(guò)程已創(chuàng)建。
5、運(yùn)行存儲(chǔ)過(guò)程
SQL
set
serveroutput
on
SQL
execute
test1(1);
輸入?yún)?shù)是1
PL/SQL
過(guò)程已成功完成。
6、查看存儲(chǔ)過(guò)程的代碼
SQL
select
name,text
from
all_source
where
type='PROCEDURE'
and
name='TEST1';
結(jié)果:看不到其原碼
可以使用wrap 工具或者DBMS_DDL子程序?qū)L/SQL源碼進(jìn)行加密。wrap工具加密單個(gè)源文件,如SQL*Plus腳本。DBMS_DDL子程序加密單個(gè)動(dòng)態(tài)生成的PL/SQL單元,如一個(gè)CREATE PROCEDURE聲明。加密的源文件可以移動(dòng),備份,可被SQL*Plus和Improt和Export工具處理,但在靜態(tài)數(shù)據(jù)字典視圖*_SOURCE中無(wú)法看到源碼。 WRAP語(yǔ)法 wrap iname=input_file [oname=output_file ] 可省略文件擴(kuò)展名,如以下的命令是等同的: wrap iname=/mydir/myfile wrap iname=/mydir/myfile.sql 輸出文件默認(rèn)的擴(kuò)展名為.plb,當(dāng)然你也可以指定不同的文件名和擴(kuò)展名。 wrap iname=/mydir/myfile oname=/yourdir/yourfile.out wrap主要是混淆PL/SQL語(yǔ)句的主體部分,如下CREATE語(yǔ)句可以被加密: CREATE [OR REPLACE] FUNCTION function_name CREATE [OR REPLACE] PROCEDURE procedure_name CREATE [OR REPLACE] PACKAGE package_name CREATE [OR REPLACE] PACKAGE BODY package_name CREATE [OR REPLACE] TYPE type_name AS OBJECT CREATE [OR REPLACE] TYPE type_name UNDER type_name CREATE [OR REPLACE] TYPE BODY type_name CREATE [OR REPLACE] TRIGGER語(yǔ)句不能被加密,但你可調(diào)用加密的過(guò)程。加密文件中除了語(yǔ)句頭部和C風(fēng)格(/*…*/)注釋外,其它所有注釋被刪除。
設(shè)置加密密鑰:
Oracle 透明數(shù)據(jù)加密提供了實(shí)施加密所必需的關(guān)鍵管理基礎(chǔ)架構(gòu)。 加密的工作原理是將明文數(shù)據(jù)以及秘密(稱作密鑰)傳遞到加密程序中。 加密程序使用提供的密鑰對(duì)明文數(shù)據(jù)進(jìn)行加密,然后返回加密數(shù)據(jù)。 以往,創(chuàng)建和維護(hù)密鑰的任務(wù)由應(yīng)用程序完成。 Oracle 透明數(shù)據(jù)加密通過(guò)為整個(gè)數(shù)據(jù)庫(kù)自動(dòng)生成一個(gè)萬(wàn)能密鑰解決了此問(wèn)題。 在啟動(dòng) Oracle 數(shù)據(jù)庫(kù)時(shí),管理員必須使用不同于系統(tǒng)口令或 DBA 口令的口令打開(kāi)一個(gè) Oracle Wallet 對(duì)象。 然后,管理員對(duì)數(shù)據(jù)庫(kù)萬(wàn)能密鑰進(jìn)行初始化。 萬(wàn)能密鑰是自動(dòng)生成的。
性能:
由于索引數(shù)據(jù)未被加密,因此加密通常會(huì)影響現(xiàn)有的應(yīng)用程序索引。 Oracle 透明數(shù)據(jù)加密對(duì)與給定應(yīng)用程序表關(guān)聯(lián)的索引值進(jìn)行加密。 這意味著應(yīng)用程序中的相等搜索對(duì)性能的影響很小,甚至沒(méi)有任何影響。 例如,假設(shè)應(yīng)用程序 card_id存在一個(gè)索引,并且此應(yīng)用程序執(zhí)行以下語(yǔ)句:
SQL Select cash from credit_card where card_id = '1025023590';
Oracle 數(shù)據(jù)庫(kù)將使用現(xiàn)有的應(yīng)用程序索引,盡管 card_id信息已經(jīng)在數(shù)據(jù)庫(kù)中加密。
準(zhǔn)備用于加密的數(shù)據(jù)庫(kù):
在本部分內(nèi)容中,您將更新 sqlnet.ora、創(chuàng)建一個(gè)加密錢(qián)夾 (ewallet.p12)、打開(kāi)此錢(qián)夾并為 TDE創(chuàng)建萬(wàn)能密鑰。執(zhí)行以下操作:
1. 您需要更新 sqlnet.ora 文件以包含一個(gè) ENCRYPTED_WALLET_LOCATION 條目。打開(kāi)一個(gè)終端窗口,然后輸入以下命令:
cd $ORACLE_HOME/network/admin
gedit sqlnet.ora
將以下條目添加到文件末尾:
ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/admin/test97/wallet/)))
如果不加這一項(xiàng)的話,則會(huì)提示下面錯(cuò)誤:
SQL alter system set key identified by "hurray"
2 ;
alter system set key identified by "hurray"
*
ERROR at line 1:
ORA-28368: cannot auto-create wallet
/opt/oracle/admin/test97/wallet/ 目錄是用來(lái)存放生成的錢(qián)夾的。
可以為加密錢(qián)夾選擇任何目錄,但路徑不應(yīng)指向在數(shù)據(jù)庫(kù)安裝過(guò)程中創(chuàng)建的標(biāo)準(zhǔn)模糊錢(qián)夾(cwallet.sso)。
2. 接下來(lái),您需要打開(kāi)錢(qián)夾并創(chuàng)建萬(wàn)能加密密鑰。從終端窗口中,輸入以下命令:
connect / as sysdbaalter system set key identified by "welcome1";
此命令的作用為:
l 如果指定的目錄中不存在加密錢(qián)夾,則將創(chuàng)建加密錢(qián)夾 (ewallet.p12)、打開(kāi)此錢(qián)夾并創(chuàng)建/重新創(chuàng)建 TDE 的萬(wàn)能密鑰。
l 如果指定目錄中存在加密錢(qián)夾,則將打開(kāi)此錢(qián)夾并創(chuàng)建/重新創(chuàng)建 TDE 的萬(wàn)能密鑰。
之后,就可以測(cè)試數(shù)據(jù)了。
下面是實(shí)驗(yàn)記錄:
alter system set key identified by "welcome1";
SQL conn dodd/dodd123
create table test (id number,credit_card_number varchar2(16) ENCRYPT NO SALT);
SQL insert into test values(1,'1231243242');
1 row created.
SQL insert into test values(2,'33245235');
SQL commit;
Commit complete.
SQL select * from test;
ID CREDIT_CARD_NUMB
---------- ----------------
1 1231243242
2 33245235
可見(jiàn),數(shù)據(jù)查看是明文,因?yàn)檫@個(gè)時(shí)候,加密錢(qián)夾已經(jīng)打開(kāi),數(shù)據(jù)可以解密。
這時(shí),停止數(shù)據(jù)庫(kù),再打開(kāi):
SQL shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL SQL startup
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed Size 1979968 bytes
Variable Size 138414528 bytes
Database Buffers 377487360 bytes
Redo Buffers 6406144 bytes
Database mounted.
Database opened.
SQL select * from dodd.test;
select * from dodd.test
*
ERROR at line 1:
ORA-28365: wallet is not open
SQL select id from dodd.test;
ID
----------
1
2
可以看到,因?yàn)閿?shù)據(jù)庫(kù)重啟后,加密錢(qián)夾處于關(guān)閉狀態(tài),這時(shí)只要查詢到加密的列,會(huì)提示加密錢(qián)夾沒(méi)有打開(kāi)。
如果用戶想打開(kāi)錢(qián)夾,必須具有alter system權(quán)限。
下面打開(kāi)wallet:
SQL conn / as sysdba
Connected.
SQL alter system set wallet open identified by "welcome1";
System altered.
SQL conn dodd/dodd123
Connected.
SQL select * from test;
ID CREDIT_CARD_NUMB
---------- ----------------
1 1231243242
2 33245235
可以看到,加密錢(qián)夾打開(kāi)后,數(shù)據(jù)可以被解密。
還有一條:sys用戶的表不能被加密。
可見(jiàn):Oracle TDE是在數(shù)據(jù)層面上對(duì)表里的數(shù)據(jù)加密,而且不會(huì)影響數(shù)據(jù)庫(kù)現(xiàn)有的權(quán)限控制策略。
salt實(shí)際上就是在加密過(guò)程中引入一個(gè)隨機(jī)性。簡(jiǎn)單的說(shuō),就是一般來(lái)說(shuō),同樣的明文產(chǎn)生同樣的密文,這樣就導(dǎo)致容易被解密者通過(guò)分析詞頻之類的方式(加解密我不太懂)來(lái)通過(guò)密文破解明文,如果指定salt,那么即使同樣的明文加密后的密文也是不一樣的。
no salt的話,自然就是相同的明文會(huì)產(chǎn)生相同的密文了。對(duì)于索引來(lái)說(shuō),要求no salt也就可以理解了
丟失ewallet加密錢(qián)夾的話,是不能再解密數(shù)據(jù)的。
Oracle 10gR2的 TDE 特性,對(duì)于防止機(jī)密信息的泄漏能起到事半功倍的作用!
1、DBMS_OBFUSCATION_TOOLKIT.MD5是MD5編碼的數(shù)據(jù)包函數(shù)
CREATE OR REPLACE FUNCTION MD5(passwd IN VARCHAR2)
RETURN VARCHAR2
IS
retval varchar2(32);
BEGIN
retval := utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING = passwd)) ;
RETURN retval;
END;
select md5('123456') from dual;
MD5('123456')
e10adc3949ba59abbe56e057f20f883e
2、DES加密
create or replace function
encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is
v_text varchar2(4000);
v_enc varchar2(4000);
raw_input RAW(128) ;
key_input RAW(128) ;
decrypted_raw RAW(2048);
begin
v_text := rpad( p_text, (trunc(length(p_text)/8)+1)*8, chr(0));
raw_input := UTL_RAW.CAST_TO_RAW(v_text);
key_input := UTL_RAW.CAST_TO_RAW(p_key);
dbms_obfuscation_toolkit.DESEncrypt(input = raw_input,key = key_input,encrypted_data =decrypted_raw);
v_enc := rawtohex(decrypted_raw);
dbms_output.put_line(v_enc);
return v_enc;
end;
DES加密:
update tb_salarysign_staff s set s.staffpwd =encrypt_des(s.staffpwd, 'test#5124*!de');
3、DES解密函數(shù)
create or replace function decrypt_des(p_text varchar2,p_key varchar2) return varchar2 is
v_text varchar2(2000);
begin
dbms_obfuscation_toolkit.DESDECRYPT(input_string = UTL_RAW.CAST_TO_varchar2(p_text),key_string =p_key, decrypted_string= v_text);
v_text := rtrim(v_text,chr(0));
dbms_output.put_line(v_text);
return v_text;
end;
DES解密:select decrypt_des(s.staffpwd, 'test#5124*!de') from tb_salarysign_staff s;
Oracle 提供兩種加密方式:
a)加密 API 例如包 和 dbms_crypto 使用這些包,可以構(gòu)建我們自己的基礎(chǔ)架構(gòu),對(duì)數(shù)據(jù)進(jìn)行加密。 這種方法的靈活性最強(qiáng),但是構(gòu)建和管理卻相當(dāng)復(fù)雜。
b)透明的數(shù)據(jù)加密是 Oracle 數(shù)據(jù)庫(kù) ;使用該特性后,就不必手動(dòng)進(jìn)行密碼管理了。
數(shù)據(jù)庫(kù)管理密碼,但是正如名稱所指,加密是透明的——數(shù)據(jù)僅僅以加密的方式存儲(chǔ)而已。在Oracle10g中出現(xiàn)了dbms_crypto替代了之前的dbms_obfuscation_toolkit,DBMS_CRYPTO增加了若干新的加密算法、哈希算法。
DBMS_CRYPTO還撤銷了對(duì)于public組的執(zhí)行權(quán)限。