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加密解密的更多相关文章

  1. oracle加密encrypt,解密decrypt

    目录 oracle加密encrypt,解密decrypt 加密 解密 oracle加密encrypt,解密decrypt 有的oracle版本没有加解密函数,以下操作可以手动添加 oracle数据使用 ...

  2. java aes_cbc_256 加密解密

    在之前我们在openssl上和ios上分别测试了 AES256位cbc模式的加密和解密 今天用java提供的api来测试一下:进而确定一下在PC,iOS,安卓上三个平台下的加密解密数据: 1. 首先通 ...

  3. 使用springboot完成密码的加密解密

    现今对于大多数公司来说,信息安全工作尤为重要,就像京东,阿里巴巴这样的大公司来说,信息安全是最为重要的一个话题,举个简单的例子: 就像这样的密码公开化,很容易造成一定的信息的泄露.所以今天我们要讲的就 ...

  4. springcloud之config 配置管理中心之配置属性加密解密

    1.为什么要加密解密? 为了维护项目的安全性. 2.配置加密解密的前提是什么? 要进行JCE下载,然后替换掉jdk的security文件: 下载链接:http://www.oracle.com/tec ...

  5. Java语言实现 Base64 加密 & 解密

    Java语言实现 Base64 加密 & 解密 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. Base64 ...

  6. AES实现财务数据的加密解密存储

    需求背景 众所周知,金融行业有各种各样的财务报表,有些报表涉及到公司财务或经营相关的敏感数据,需要进行加密存储,只有掌握密钥的用户才能看到解密后的数据.注意,这里所说的加密并不是针对整个数据库或者表全 ...

  7. PHP的学习--RSA加密解密

    PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了. 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了. 密码没加 ...

  8. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  9. .NET和JAVA中BYTE的区别以及JAVA中“DES/CBC/PKCS5PADDING” 加密解密在.NET中的实现

    场景:java 作为客户端调用已有的一个.net写的server的webservice,输入string,返回字节数组. 问题:返回的值不是自己想要的,跟.net客户端直接调用总是有差距 分析:平台不 ...

随机推荐

  1. centos配置/etc/mail.rc发邮件

    安装mailx: yum install mailx vi /etc/mail.rc set from=524755798@qq.comset smtp="smtps://smtp.qq.c ...

  2. 学习activiti的时候使用truncate命令清空表

    参考文档: https://blog.csdn.net/iw1210/article/details/79586033 https://www.cnblogs.com/hougang/p/mysql_ ...

  3. react——Table组件

    /* * 构建数据列 * */ tableColumns = (currentData) => { let group = lodashGroupBy(currentData, 'level1' ...

  4. upload-labs 上传漏洞靶场环境以及writeup

    一个帮你总结所有类型的上传漏洞的靶场 https://github.com/c0ny1/upload-labs 靶场环境(基于phpstudy这个php集成环境) https://github.com ...

  5. 【Tools】三款笔记本电脑硬件检测工具-官网下载

    一.CPU-Z 下载地址: https://www.cpuid.com/softwares/cpu-z.html 描述: CPU-Z已经是大名鼎鼎了.这里就不多说了.  二.Cinebench   下 ...

  6. RabbitMQ官方教程一Hello World(GOLANG语言实现)

    介绍 RabbitMQ是消息中间件:它接受并转发消息. 您可以将其视为邮局系统:将要发送的邮件放在邮箱中时, 可以确保邮递员最终将邮件传递给收件人. 以此类推,RabbitMQ是一个邮箱,一个邮局和一 ...

  7. git如何新建分支

    1) 切换到基础分支,如主干 git checkout master 2)创建并切换到新分支 git checkout -b panda git branch可以看到已经在panda分支上 3)更新分 ...

  8. 虚拟机中windows下制作超级隐藏账户

    这篇博客非原创,我只是将很多大佬写的东西理解了一下写了出来. 接下来的实验最好在虚拟机进行,因为可以快照~ 制作隐藏用户可以说是两种方法但是基本操作一样,所以我们穿插着进行一种是隐藏账户,一种是影子账 ...

  9. JAVA 后台面试之操作系统问题集锦

    1.进程和线程以及他们的区别 2.进程间通信的几种方式 3.线程同步的方式 4.死锁 5.分页和分段有什么区别?(内存管理) 6.操作系统中进程调度的策略有哪几种? 7.页面置换算法: 8.系统颠簸 ...

  10. python openpyxl模块实现excel的读取,新表创建及原数据表追加新数据

    当实际工作需要把excel表的数据读取出来,或者把一些统计数据写入excel表中时,一个设计丰富,文档便于寻找的模块就会显得特别的有吸引力,本文对openpyxl模块的一些常见用法做一些记录,方便工作 ...