Oracle加密解密

摘要:
Oracle有一个特殊的加密包,可以轻松地对内部数据进行加密和解密。在介绍加密包之前,让我们简单谈谈基本的Oracle数据类型—RAW类型。RAW用于保存位字符串的数据类型,类似于CHAR。声明方法为RAW(L)。L是长度,以字节为单位。作为数据库列,它最多可以为2000字节,作为变量,它最多可为32767字节。操作RAW类型函数:utl_RAW。铸造至_

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算法加密解密

DECLARE
  v_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算法加密

DECLARE
  v_str VARCHAR2(100) := '123456';
  v_key VARCHAR2(100) := 'oracle9i';
  
  encrypted_str VARCHAR2(32);
  encrypted_raw RAW(32);
BEGIN
  -- encrypted as string
  dbms_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 raw
  dbms_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类型的加密)
DECLARE v_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;

 可以加加密和解密的内容写入函数中,方便使用的时候直接调用。

免责声明:文章转载自《Oracle加密解密》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇虚拟机自动获取ip//脚本修改ip和主机名sql server百万级别数据量 农码一生下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IDEA使用switch传入String编译不通过

今天在使用IDEA的时候,用到switch分支语句,传入String参数的时候一直报错,下面是源码报错截图: 看错误提示并没有提到switch支持String类型,不过ava1.7之后就支持String类型才对呀,于是想到了会不会是JDK问题,但是JDK用的是1.8呀!网上搜索才发现,会不会是编译环境版本过低的原因呢?于是查看对IDEA的ProjectS...

关于Android中的三级缓存

三级缓存的提出就是为了提升用户体验。当我们第一次打开应用获取图片时,先到网络去下载图片,然后依次存入内存缓存,磁盘缓存,当我们再一次需要用到刚才下载的这张图片时,就不需要再重复的到网络上去下载,直接可以从内存缓存和磁盘缓存中找,由于内存缓存速度较快,我们优先到内存缓存中寻找该图片,如果找到则运用,如果没有找到(内存缓存大小有限),那么我们再到磁盘缓存中去找...

缓存子系统如何设计

缓存子系统如何设计 大家对这段代码肯定很熟悉吧: public List<UserInfo> SearchUsers(stringuserName) { string cacheKey=string.Format("SearchUsers_{0}", userName);...

java基础知识--日期时间类

1.1 Date类  java.util.Date类 表示特定的瞬间,精确到毫秒。 继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期对象。 public Date():分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。 public Date(long date)...

将json转换为数据结构体

主要用到的依赖:(划重点:这个依赖需要加jdk版本号,不加的话用不了,且目前最高是jdk15) (ps: 用于json与其他类型格式转换,JSONObject, JSONArray等来自这个包) <!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->...

C#中IntPtr

C#中IntPtr System.Object System.ValueType System.IntPtr 1.C#中的IntPtr类型被称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄。 2.资源的大小取决于使用的硬件和操作系统,即此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统中将是64位;但其大小总是足以包含系统的...