Oracle加密解密

Oracle內部有專門的加密包,可以很方便的對內部數據進行加密(encrypt)和解密(decrypt).

  介紹加密包之前,先簡單說一下Oracle基本數據類型——RAW類型

  RAW,用于保存位串的數據類型,類似于CHAR,聲明方式RAW(L),L為長度,以字節為單位,作為數據庫列最大2000,作為變量最大32767字節。

? ?? 操作RAW類型的函數:

    utl_raw.cast_to_raw([varchar2]):將varchar2轉換為raw類型

    utl_raw.cast_to_varchar2([raw]):將raw轉換為varchar2類型

    hextoraw():十六進制字符串轉換為raw

    rawtohex():將raw串轉換為十六進制

    ? 注:RAW保存的為16進制數,當使用HEXTORAW時,會把字符串中數據當作16進制數。而使用UTL_RAW.CAST_TO_RAW時,直接把字符串中每個字符的ASCII碼存放到RAW類型的字段中。

 ??? ? ? ? eg>select hextoraw('abc') from dual;??? --輸出結果為: ABC

    eg>select utl_raw.cast_to_raw('abc') from dual; ?? --輸出結果為:?616263(a的ASCII碼值為97,轉換成16進制數為61)

?

下面介紹一下Oracle中的加密包:

1,Dbms_Obfuscation_Toolkit(9i)

  利用Dbms_Obfuscation_Toolkit包,我們可以對數據進行DES,Triple DES或者MD5加密

  ?? DESGETKEY?? -- 產生密鑰,用于DES算法
??   DES3GETKEY? -- 產生密鑰,用于Triple DES算法
??   DESENCRYPT? -- 用DES算法加密數據
??   DESDECRYPT? -- 用DES算法解密數據
??   DES3ENCRYPT -- 用Triple DES算法加密數據
??   DES3DECRYPT -- 用DES算法解密數據
??   MD5???????? -- 用MD5算法加密數據

  加密包中分別采用raw和string兩種數據類型加密,分別測試一下:(注:加密的字符串(input_string)必須是8的倍數)

DES算法加密解密

DECLAREv_input VARCHAR2(100) := '12345678';v_key   VARCHAR2(100) := 'oracle9i';-- ORA-28232: obfuscation 工具箱的輸入長度無效(原因是加密字符串必須是8的倍數)encrypted_str VARCHAR2(4000);decrypted_str VARCHAR2(4000);encrypted_raw RAW(4000);decrypted_raw RAW(4000);
BEGIN-- string類型加密解密-- encrypt(string)dbms_obfuscation_toolkit.desencrypt(input_string => v_input, key_string => v_key, encrypted_string => encrypted_str);dbms_output.put_line('Encrypted string: ' || encrypted_str);dbms_output.put_line('Encrypted hex value: ' || utl_raw.cast_to_raw(encrypted_str));-- decrypt(string)dbms_obfuscation_toolkit.desdecrypt(input_string => encrypted_str, key_string => v_key, decrypted_string => decrypted_str);dbms_output.put_line('Decrypted String: ' || decrypted_str);-- raw類型加密解密-- encrypt(raw)dbms_obfuscation_toolkit.desencrypt(input => utl_raw.cast_to_raw(v_input), key => utl_raw.cast_to_raw(v_key), encrypted_data => encrypted_raw);dbms_output.put_line('Encrypted Raw: ' || encrypted_raw);dbms_output.put_line('Encrypted hex value: ' || rawtohex(encrypted_raw));-- decrypt(raw)dbms_obfuscation_toolkit.desdecrypt(input => encrypted_raw, key => utl_raw.cast_to_raw(v_key), decrypted_data => decrypted_raw);dbms_output.put_line('Decrypted String: ' || utl_raw.cast_to_varchar2(decrypted_raw));
END;

注:DES算法加密的key長度必須大于等于8,而且加密的結果只跟其前8位有關(推測可能是截取了字符串);

Triple DES算法加密(DES3ENCRYPT)用法同DES基本類似,安全性叫DES算法更高;

??? 同理,Triple DES算法的key長度必須大于等于16,且結果只與其前16位有關;

?(Extra:數據類型PLS_INTEGER可以存儲一個有符號的整型值,其精度范圍和BINARY_INTEGER一樣,是-2^31~2^31

MD5算法加密

DECLAREv_str VARCHAR2(100) := '123456';v_key VARCHAR2(100) := 'oracle9i';encrypted_str VARCHAR2(32);encrypted_raw RAW(32);
BEGIN-- encrypted as stringdbms_obfuscation_toolkit.MD5(input_string => v_str || v_key, checksum_string => encrypted_str);dbms_output.put_line('Encrypted String: ' || encrypted_str);dbms_output.put_line('Encrypted hex value: ' || utl_raw.cast_to_raw(encrypted_str));-- encrypted as rawdbms_obfuscation_toolkit.MD5(input => utl_raw.cast_to_raw(v_str || v_key), checksum => encrypted_raw);dbms_output.put_line('Encrypted Raw: ' || encrypted_raw);dbms_output.put_line('Encrypted hex value: ' || rawtohex(encrypted_raw));
END;

?注:MD5算法只能正向加密,但它多次對于同一數據的加密計算結果是相同的。

?

2,dbms_crypto(10g以后)

  dbms_crypto包默認只有sysdba用戶才可執行,其他任何用戶都需要sysdba進行授權

  sys>grant execute on dbms_crypto to scott;

-- 示例(不考慮BLOB類型的加密)
DECLAREv_str VARCHAR2(20) := '12345678'; -- 加密的字符串v_type PLS_INTEGER := dbms_crypto.DES_CBC_PKCS5; -- 加密類型v_key RAW(256);v_key1 VARCHAR2(100) := 'oracle9i012';encrypted_raw RAW(256);decrypted_raw RAW(256); BEGIN-- 生成隨機16位密鑰 (1個byte等于兩位raw)v_key := dbms_crypto.RandomBytes(8);dbms_output.put_line('Encrypted Key: ' || v_key);-- 加密encrypted_raw := dbms_crypto.Encrypt(src => utl_raw.cast_to_raw(v_str), typ => v_type, key => v_key);dbms_output.put_line('Encrypted Raw: ' || encrypted_raw);dbms_output.put_line('Encrypted hex value: ' || rawtohex(encrypted_raw));-- 解密decrypted_raw := dbms_crypto.Decrypt(src => encrypted_raw, typ => v_type, key => v_key);dbms_output.put_line('Decrypted String: ' || utl_raw.cast_to_varchar2(decrypted_raw)); END;

?可以加加密和解密的內容寫入函數中,方便使用的時候直接調用。

轉載于:https://www.cnblogs.com/colaclicken/p/10972444.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387617.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387617.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387617.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

條件變量 sync.Cond

sync.Cond 條件變量是基于互斥鎖的,它必須有互斥鎖的支撐才能發揮作用。 sync.Cond 條件變量用來協調想要訪問共享資源的那些線程,當共享資源的狀態發生變化的時候,它可以用來通知被互斥鎖阻塞的線程條件變量的初始化離不開互斥鎖&#xff0c…

JDK內置工具使用

JDK內置工具使用 一、javah命令(C Header and Stub File Generator) 二、jps命令(Java Virtual Machine Process Status Tool) 三、jstack命令(Java Stack Trace) 四、jstat命令(Java Virtual Machine Statistics Monitoring Tool) 五、jmap命令(Java Memory Map) 六、jinfo命令…

mall整合RabbitMQ實現延遲消息

摘要 本文主要講解mall整合RabbitMQ實現延遲消息的過程,以發送延遲消息取消超時訂單為例。RabbitMQ是一個被廣泛使用的開源消息隊列。它是輕量級且易于部署的,它能支持多種消息協議。RabbitMQ可以部署在分布式和聯合配置中,以滿足高規模、高可…

競價打板的關鍵點

競價打板,主要是速度,其他不重要的,如果為了當天盈利大,失去競價打板的本質含義,因為競價可以買到,盤中買不到,才是競價打板的目的,也就是從競價打板的角度看,主要是看習…

Java常見的幾種內存溢出及解決方法

Java常見的幾種內存溢出及解決方法【情況一】:java.lang.OutOfMemoryError:Javaheapspace:這種是java堆內存不夠,一個原因是真不夠(如遞歸的層數太多等),另一個原因是程序中有死循環;如果是java…

docker操作之mysql容器

1、創建宿主機器的掛載目錄 /opt/docker/mysql/conf /opt/docker/mysql/data /opt/docker/mysql/logs 2、創建【xxx.cnf】配置文件,內容如下所示: [mysqld]#服務唯一Idserver-id 1port 3306log-error /var/log/mysql/error.log #只能用IP地址skip_nam…

Windows10系統下wsappx占用CPU資源過高?wsappx是什么?如何關閉wsappx進程?

在Windows10系統開機的時候,wsappx進程占用的CPU資源非常高,導致電腦運行速度緩慢,那么我們如何關閉wsappx進程,讓電腦加快運行速度呢?下面就一起來看一下操作的方法吧。 【現象】 1、先來看一下電腦剛開機的時候&…

如何通過Windows Server 2008 R2建立NFS存儲

如何通過Windows Server 2008 R2建立NFS存儲在我們日常工作的某些實驗中,會需要使用存儲服務器。而硬件存儲成本高,如StarWind之類的iSCSI軟存儲解決方案需要單獨下載服務器端程序,且配置比較繁瑣,令很多新手們很是頭疼。事實上&a…

python-windows安裝相關問題

1.python的環境配置,有些時候是沒有配置的,需要在【系統環境】-【path】里添加。 2.安裝pip:從官網下載pip包,然后到包目錄》python setup.py install 安裝 3.安裝scrapyd:正常使用pip3 install scrapyd安裝不起&…

hdu 1542/1255 Atlantis/覆蓋的面積

1542 1255 兩道掃描線線段樹的入門題。 基本沒有什么區別&#xff0c;前者是模板&#xff0c;后者因為是求覆蓋次數至少在兩次以上的&#xff0c;這個同樣是具有并集性質的&#xff0c;所以把cover的判斷條件更改一下就可以了qwq。 hdu1542 代碼如下&#xff1a; #include<i…

使用了JDK自帶的jconsole查看Tomcat運行情況

最近對公司的項目進行JVM調優&#xff0c;使用了JDK自帶的jconsole查看Tomcat運行情況&#xff0c;記錄下配置以便以后參考&#xff1a;首先&#xff0c;修改Tomcat的bin目錄下的catalina.bat文件&#xff0c;在JAVA_OPTS變量中添加下面四行&#xff0c;即可set JAVA_OPTS %JAV…

jvm02

java虛擬機內存管理 每個線程就是一個順序的執行單元&#xff0c;線程共享區即多個線程共享同一塊區域&#xff0c;線程獨占區即每個線程都有自己的虛擬機棧&#xff0c;本地方法棧&#xff0c;程序計數器。 程序計數器是一個比較小的內存空間&#xff0c;可以看作是當前線程所…

搭建svn管理平臺

安裝svn服務器&#xff1a;yum -y install subversion創建svn的目錄&#xff1a;mkdir -p /data/svn初始化svn目錄&#xff1a;svnadmin create /data/svnconf下的三個目錄介紹&#xff1a;authz&#xff1a;控制權限,創建用戶。密碼在passwd創建 passwd&#xff1a;密碼文件&…

Oracle dataguard 正常切換和應急切換

Oracle dataguard 正常切換和應急切換oracle dataguard提供異地容災方案,能有效的防止單點故障和提供高可用技術,這里介紹dataguard正常主備切換和應急切換&#xff08;應急切換模擬主庫出現問題無法還原,備庫脫離dataguard接管主庫對外提供服務&#xff09;1&#xff09;Oracl…

好程序員web前端分享JS引擎的執行機制

好程序員web前端分享JS引擎的執行機制&#xff0c;請先著重牢記兩點&#xff01;JS是單線程語言。JS的EventLoop是JS的執行機制。深入了解JS的執行&#xff0c;就等于深入了解JS里的eventloop。1、靈魂三問&#xff1a;JS為什么是單線程的?為什么需要異步?單線程又是如何實現…

shutil模塊、json和pickle模塊

shutil模塊&#xff1a; 高級的文件、文件夾、壓縮包處理模塊 json和pickle模塊 之前學過eval內置方法可以將一個字符串轉化成Python對象&#xff0c;但eval方法是有局限性的&#xff0c;對于普通的數據類型&#xff0c;json.loads、eval都可以使用&#xff0c;但遇到特殊類型的…

每日一問:LayoutParams 你知道多少?

前面的文章中著重講解了 View 的測量流程。其中我提到了一句非常重要的話&#xff1a;**View 的測量匡高是由父控件的 MeasureSpec 和 View 自身的 LayoutParams 共同決定的。**我們在前面的 每日一問&#xff1a;談談對 MeasureSpec 的理解 把 MeasureSpec 的重點進行了講解&a…

kuangbin專題十六 KMP擴展KMP HDU2594 Simpsons’ Hidden Talents

Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had. Marge: Yeah, what is it? Homer: Take me for example. I want to find out if I have a talent in politics, OK? Marge: OK. Homer: So I take some politician’s na…

SNI: 實現多域名虛擬主機的SSL/TLS認證

為什么80%的碼農都做不了架構師&#xff1f;>>> 一. 介紹 早期的SSLv2根據經典的公鑰基礎設施PKI(Public Key Infrastructure)設計&#xff0c;它默認認為&#xff1a;一臺服務器&#xff08;或者說一個IP&#xff09;只會提供一個服務&#xff0c;所以在SSL握手時…

echo(),print(),print_r(),var_dump()的區別

echo可以一次輸出多個值&#xff0c;多個值之間用逗號分隔。echo是語言結構(language construct)&#xff0c;而并不是真正的函數&#xff0c;因此不能作為表達式的一部分使用。echo是php的內部指令&#xff0c;不是函數&#xff0c;無返回值。 print()&#xff1a;函數print()…