這個主要看軟件開發(fā)人員的加密方式
為太康等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及太康網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計、做網(wǎng)站、太康網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
一般流程是,
1.新建用戶,或者修改密碼時候,將用戶輸入的密碼按照一定的加密方式加密后儲存在數(shù)據(jù)庫
2.在用戶登錄的時候,將用戶所輸入的密碼再次進(jìn)行加密后與數(shù)據(jù)庫內(nèi)的加密密碼對比
這樣做的好處是,防止密碼在網(wǎng)絡(luò)傳輸過程中被截取,比如黑客可以對網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)進(jìn)行抓包分析,對于加密的密碼在傳輸過程中不是以明文進(jìn)行傳輸,如果被竊取到數(shù)據(jù),不能得到有效破解,也是沒有用的,這就增加了可靠性。
用于加密非LOB字段的透明數(shù)據(jù)加密語法與在Oracle SecureFiles中啟用加密的語法完全相同。它們有一個重要的區(qū)別,非LOB字段可以使用NO SALT參數(shù)阻止TDE在加密數(shù)據(jù)之前先給數(shù)據(jù)添加一個隨機(jī)字符串。Oracle SecureFile LOB字段不支持NO SALT選項。我們可以使用數(shù)據(jù)字典視圖USER_ENCRYPTED_COLUMNS確定應(yīng)該加密哪一些字段,以及這些字段的狀態(tài)。下面是一些ENCRYPT子句的例子:
CREATE TABLE tab_3DES (col1 CLOB ENCRYPT USING '3DES168')
LOB(col1) STORE AS SECUREFILE(
CACHE
NOLOGGING
);
使用默認(rèn)加密算法(AES192)和一個密碼創(chuàng)建一個Oracle SecureFile LOB字段:
CREATE TABLE tab_enc_pw (col1 CLOB ENCRYPT IDENTIFIED BY badpassword)
LOB(col1) STORE AS SECUREFILE(
CACHE
);
使用AES256啟用LOB加密:
ALTER TABLE tab_nocrypt MODIFY
( col1 CLOB ENCRYPT USING 'AES256');
通過重新生成加密密鑰修改一個Oracle SecureFiles字段:
ALTER TABLE tab_3DES REKEY USING 'AES256';
Disable LOB encryption:
禁用LOB加密:
ALTER TABLE tab_enc_pw MODIFY
( col1 CLOB DECRYPT);
Oracle數(shù)據(jù)庫中存儲的大對象數(shù)據(jù)容量會繼續(xù)增長,但是存儲費用在不斷下降。其中有許多的敏感數(shù)據(jù),如醫(yī)療記錄、員工數(shù)據(jù)和知識產(chǎn)權(quán)。能夠?qū)@些信息進(jìn)行加密,這是非常寶貴的,也可以避免在將來投入大量金錢和精力去實現(xiàn)安全性。
設(shè)置加密密鑰:
Oracle 透明數(shù)據(jù)加密提供了實施加密所必需的關(guān)鍵管理基礎(chǔ)架構(gòu)。 加密的工作原理是將明文數(shù)據(jù)以及秘密(稱作密鑰)傳遞到加密程序中。 加密程序使用提供的密鑰對明文數(shù)據(jù)進(jìn)行加密,然后返回加密數(shù)據(jù)。 以往,創(chuàng)建和維護(hù)密鑰的任務(wù)由應(yīng)用程序完成。 Oracle 透明數(shù)據(jù)加密通過為整個數(shù)據(jù)庫自動生成一個萬能密鑰解決了此問題。 在啟動 Oracle 數(shù)據(jù)庫時,管理員必須使用不同于系統(tǒng)口令或 DBA 口令的口令打開一個 Oracle Wallet 對象。 然后,管理員對數(shù)據(jù)庫萬能密鑰進(jìn)行初始化。 萬能密鑰是自動生成的。
性能:
由于索引數(shù)據(jù)未被加密,因此加密通常會影響現(xiàn)有的應(yīng)用程序索引。 Oracle 透明數(shù)據(jù)加密對與給定應(yīng)用程序表關(guān)聯(lián)的索引值進(jìn)行加密。 這意味著應(yīng)用程序中的相等搜索對性能的影響很小,甚至沒有任何影響。 例如,假設(shè)應(yīng)用程序 card_id存在一個索引,并且此應(yīng)用程序執(zhí)行以下語句:
SQL Select cash from credit_card where card_id = '1025023590';
Oracle 數(shù)據(jù)庫將使用現(xiàn)有的應(yīng)用程序索引,盡管 card_id信息已經(jīng)在數(shù)據(jù)庫中加密。
準(zhǔn)備用于加密的數(shù)據(jù)庫:
在本部分內(nèi)容中,您將更新 sqlnet.ora、創(chuàng)建一個加密錢夾 (ewallet.p12)、打開此錢夾并為 TDE創(chuàng)建萬能密鑰。執(zhí)行以下操作:
1. 您需要更新 sqlnet.ora 文件以包含一個 ENCRYPTED_WALLET_LOCATION 條目。打開一個終端窗口,然后輸入以下命令:
cd $ORACLE_HOME/network/admin
gedit sqlnet.ora
將以下條目添加到文件末尾:
ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/admin/test97/wallet/)))
如果不加這一項的話,則會提示下面錯誤:
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/ 目錄是用來存放生成的錢夾的。
可以為加密錢夾選擇任何目錄,但路徑不應(yīng)指向在數(shù)據(jù)庫安裝過程中創(chuàng)建的標(biāo)準(zhǔn)模糊錢夾(cwallet.sso)。
2. 接下來,您需要打開錢夾并創(chuàng)建萬能加密密鑰。從終端窗口中,輸入以下命令:
connect / as sysdbaalter system set key identified by "welcome1";
此命令的作用為:
l 如果指定的目錄中不存在加密錢夾,則將創(chuàng)建加密錢夾 (ewallet.p12)、打開此錢夾并創(chuàng)建/重新創(chuàng)建 TDE 的萬能密鑰。
l 如果指定目錄中存在加密錢夾,則將打開此錢夾并創(chuàng)建/重新創(chuàng)建 TDE 的萬能密鑰。
之后,就可以測試數(shù)據(jù)了。
下面是實驗記錄:
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
可見,數(shù)據(jù)查看是明文,因為這個時候,加密錢夾已經(jīng)打開,數(shù)據(jù)可以解密。
這時,停止數(shù)據(jù)庫,再打開:
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
可以看到,因為數(shù)據(jù)庫重啟后,加密錢夾處于關(guān)閉狀態(tài),這時只要查詢到加密的列,會提示加密錢夾沒有打開。
如果用戶想打開錢夾,必須具有alter system權(quán)限。
下面打開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
可以看到,加密錢夾打開后,數(shù)據(jù)可以被解密。
還有一條:sys用戶的表不能被加密。
可見:Oracle TDE是在數(shù)據(jù)層面上對表里的數(shù)據(jù)加密,而且不會影響數(shù)據(jù)庫現(xiàn)有的權(quán)限控制策略。
salt實際上就是在加密過程中引入一個隨機(jī)性。簡單的說,就是一般來說,同樣的明文產(chǎn)生同樣的密文,這樣就導(dǎo)致容易被解密者通過分析詞頻之類的方式(加解密我不太懂)來通過密文破解明文,如果指定salt,那么即使同樣的明文加密后的密文也是不一樣的。
no salt的話,自然就是相同的明文會產(chǎn)生相同的密文了。對于索引來說,要求no salt也就可以理解了
丟失ewallet加密錢夾的話,是不能再解密數(shù)據(jù)的。
Oracle 10gR2的 TDE 特性,對于防止機(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;