十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
設(shè)置加密密鑰:
在臺(tái)安等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需求定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),全網(wǎng)整合營(yíng)銷(xiāo)推廣,外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè),臺(tái)安網(wǎng)站建設(shè)費(fèi)用合理。
Oracle 透明數(shù)據(jù)加密提供了實(shí)施加密所必需的關(guān)鍵管理基礎(chǔ)架構(gòu)。 加密的工作原理是將明文數(shù)據(jù)以及秘密(稱(chēng)作密鑰)傳遞到加密程序中。 加密程序使用提供的密鑰對(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)的方式(加解密我不太懂)來(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;
用于加密非LOB字段的透明數(shù)據(jù)加密語(yǔ)法與在Oracle SecureFiles中啟用加密的語(yǔ)法完全相同。它們有一個(gè)重要的區(qū)別,非LOB字段可以使用NO SALT參數(shù)阻止TDE在加密數(shù)據(jù)之前先給數(shù)據(jù)添加一個(gè)隨機(jī)字符串。Oracle SecureFile LOB字段不支持NO SALT選項(xiàng)。我們可以使用數(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)和一個(gè)密碼創(chuàng)建一個(gè)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');
通過(guò)重新生成加密密鑰修改一個(gè)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ù)庫(kù)中存儲(chǔ)的大對(duì)象數(shù)據(jù)容量會(huì)繼續(xù)增長(zhǎng),但是存儲(chǔ)費(fèi)用在不斷下降。其中有許多的敏感數(shù)據(jù),如醫(yī)療記錄、員工數(shù)據(jù)和知識(shí)產(chǎn)權(quán)。能夠?qū)@些信息進(jìn)行加密,這是非常寶貴的,也可以避免在將來(lái)投入大量金錢(qián)和精力去實(shí)現(xiàn)安全性。