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算法加密解密
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加密解密的更多相关文章
- oracle加密encrypt,解密decrypt
目录 oracle加密encrypt,解密decrypt 加密 解密 oracle加密encrypt,解密decrypt 有的oracle版本没有加解密函数,以下操作可以手动添加 oracle数据使用 ...
- java aes_cbc_256 加密解密
在之前我们在openssl上和ios上分别测试了 AES256位cbc模式的加密和解密 今天用java提供的api来测试一下:进而确定一下在PC,iOS,安卓上三个平台下的加密解密数据: 1. 首先通 ...
- 使用springboot完成密码的加密解密
现今对于大多数公司来说,信息安全工作尤为重要,就像京东,阿里巴巴这样的大公司来说,信息安全是最为重要的一个话题,举个简单的例子: 就像这样的密码公开化,很容易造成一定的信息的泄露.所以今天我们要讲的就 ...
- springcloud之config 配置管理中心之配置属性加密解密
1.为什么要加密解密? 为了维护项目的安全性. 2.配置加密解密的前提是什么? 要进行JCE下载,然后替换掉jdk的security文件: 下载链接:http://www.oracle.com/tec ...
- Java语言实现 Base64 加密 & 解密
Java语言实现 Base64 加密 & 解密 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. Base64 ...
- AES实现财务数据的加密解密存储
需求背景 众所周知,金融行业有各种各样的财务报表,有些报表涉及到公司财务或经营相关的敏感数据,需要进行加密存储,只有掌握密钥的用户才能看到解密后的数据.注意,这里所说的加密并不是针对整个数据库或者表全 ...
- PHP的学习--RSA加密解密
PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了. 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了. 密码没加 ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- .NET和JAVA中BYTE的区别以及JAVA中“DES/CBC/PKCS5PADDING” 加密解密在.NET中的实现
场景:java 作为客户端调用已有的一个.net写的server的webservice,输入string,返回字节数组. 问题:返回的值不是自己想要的,跟.net客户端直接调用总是有差距 分析:平台不 ...
随机推荐
- centos配置/etc/mail.rc发邮件
安装mailx: yum install mailx vi /etc/mail.rc set from=524755798@qq.comset smtp="smtps://smtp.qq.c ...
- 学习activiti的时候使用truncate命令清空表
参考文档: https://blog.csdn.net/iw1210/article/details/79586033 https://www.cnblogs.com/hougang/p/mysql_ ...
- react——Table组件
/* * 构建数据列 * */ tableColumns = (currentData) => { let group = lodashGroupBy(currentData, 'level1' ...
- upload-labs 上传漏洞靶场环境以及writeup
一个帮你总结所有类型的上传漏洞的靶场 https://github.com/c0ny1/upload-labs 靶场环境(基于phpstudy这个php集成环境) https://github.com ...
- 【Tools】三款笔记本电脑硬件检测工具-官网下载
一.CPU-Z 下载地址: https://www.cpuid.com/softwares/cpu-z.html 描述: CPU-Z已经是大名鼎鼎了.这里就不多说了. 二.Cinebench 下 ...
- RabbitMQ官方教程一Hello World(GOLANG语言实现)
介绍 RabbitMQ是消息中间件:它接受并转发消息. 您可以将其视为邮局系统:将要发送的邮件放在邮箱中时, 可以确保邮递员最终将邮件传递给收件人. 以此类推,RabbitMQ是一个邮箱,一个邮局和一 ...
- git如何新建分支
1) 切换到基础分支,如主干 git checkout master 2)创建并切换到新分支 git checkout -b panda git branch可以看到已经在panda分支上 3)更新分 ...
- 虚拟机中windows下制作超级隐藏账户
这篇博客非原创,我只是将很多大佬写的东西理解了一下写了出来. 接下来的实验最好在虚拟机进行,因为可以快照~ 制作隐藏用户可以说是两种方法但是基本操作一样,所以我们穿插着进行一种是隐藏账户,一种是影子账 ...
- JAVA 后台面试之操作系统问题集锦
1.进程和线程以及他们的区别 2.进程间通信的几种方式 3.线程同步的方式 4.死锁 5.分页和分段有什么区别?(内存管理) 6.操作系统中进程调度的策略有哪几种? 7.页面置换算法: 8.系统颠簸 ...
- python openpyxl模块实现excel的读取,新表创建及原数据表追加新数据
当实际工作需要把excel表的数据读取出来,或者把一些统计数据写入excel表中时,一个设计丰富,文档便于寻找的模块就会显得特别的有吸引力,本文对openpyxl模块的一些常见用法做一些记录,方便工作 ...