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. Java EE互联网轻量级框架整合开发— SSM框架(中文版带书签)、原书代码

    Java EE互联网轻量级框架整合开发 第1部分 入门和技术基础 第1章 认识SSM框架和Redis 2 1.1 Spring框架 2 1.2 MyBatis简介 6 1.3 Spring MVC简介 ...

  2. delphi 多线程定时执行程序如何写

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  3. 【linux学习笔记一】目录处理命令

    一 建立目录:mkdir make directories //创建一个name的目录 mkdir name //-p 递归创建 //在没有目录a也没有目录b的情况下 直接创建 mkdir -p a/ ...

  4. git的使用学习(四)git的远程仓库

    1.远程仓库介绍 到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了. 可是有用过集中式版本控制系统SVN的童鞋会站出来说,这些功能在SVN里早 ...

  5. package ‘RPMM’ is not available (for R version 3.6.0)

    当我们用启动R安装一些R包的时候 提示: Warning: unable to access index for repository https://mirrors.eliteu.cn/CRAN/s ...

  6. [bzoj3829][Poi2014]FarmCraft_树形dp

    FarmCraft 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=3829 数据范围:略. 题解: 因为每条边只能必须走两次,所以我们的路径一定是 ...

  7. SQL语言(二)

    SQL约束与策略 create table student( id int primary key, //主键约束 name ) not null, //非空约束 idCard ) unique, / ...

  8. [C++] 习题 2.18 倒序查找字串

    目录 前置技能 字符串 KMP 算法 需求描述 概要设计 具体实现 string.cpp strmatching.cpp main.cpp 倒序查找字串: 设计一个算法,在串 str 中查找字串 su ...

  9. BJFU-208-基于顺序存储结构的图书信息表的最贵图书的查找

    #include<stdio.h> #include<stdlib.h> #define MAX 1000 typedef struct{ double no; char na ...

  10. Python-02-基础知识

    一.第一个Python程序 [第一步]新建一个hello.txt [第二步]将后缀名txt改为py [第三步]使用记事本编辑该文件 [第四步]在cmd中运行该文件 print("Hello ...