Oracle中的加解密函数
对Oracle内部数据的加密,可以简单得使用DBMS_CRYPTO来进行,效果还是不错的,而且使用也比较方便,所以今天专门来学习一下这个包的使用方法。在使用之前,要注意两件事情:
1、DBMS_CRYPTO包是10g才有的,如果在10g以前的版本,使用DBMS_OBFUSCATION_TOOLKIT包;
2、DBMS_CRYPTO默认只有SYSDBA用户才可执行,所以其他的任何用户都需要SYSDBA进行赋权。
grant execute on dbms_crypto to user;
如果想详细了解DBMS_CRYPTO包的使用,可以查阅官方文档: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_crypto.htm
一、随机值生成
使用DBMS_CRYPTO包可以有3个函数(RandomInteger、RandomBytes、RandomNumber)来生成简单的随机值。使用这些随机数生成函数是为了在加密时生成随机的密钥。
SQL> select DBMS_CRYPTO.RandomInteger from dual;--生成整数(有正有负)
RANDOMINTEGER
-------------
-284171810
SQL> select DBMS_CRYPTO.RandomBytes(6) from dual;--生成6位Bytes(注意返回的不是byte是raw)
DBMS_CRYPTO.RANDOMBYTES(6)
------------------------------
FFEE2CB53DB4
SQL> select DBMS_CRYPTO.RandomNumber from dual;--生成Number(正数)
RANDOMNUMBER
------------
6.6453693840
二、加解密函数
1、加密函数encrypt
FUNCTION Encrypt (src IN RAW,
typ IN PLS_INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL)
RETURN RAW;
解释一下:
1、src:需要加密的内容,但是需要转换为RAW格式,不能直接对VARCHAR2格式加密.使用UTL_RAW.CAST_TO_RAW或UTL_I18N.STRING_TO_RAW函数将varchar2类型转换为raw类型
2、typ:加密类型,由DBMS_CRYPTO定义,可以查询DBMS_CRYPTO包中的Declare部分
3、key:即加密的密钥,如需解密则需要知道原先的密钥
4、iv:block密码的选项,一般都置为默认,默认为null
2、解密函数decrypt
FUNCTION DECRYPT(src IN RAW,
typ IN PLS_INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL)
RETURN RAW;
解释一下:
1、src:需要解密的内容。解密之后为RAW格式,使用UTL_RAW.CAST_TO_VARCHAR2或UTL_I18N.RAW_TO_CHAR函数将raw类型转换为varchar2类型
2、typ:加密类型,由DBMS_CRYPTO定义,可以查询DBMS_CRYPTO包中的Declare部分
3、key:即加密的密钥,如需解密则需要知道原先的密钥
4、iv:block密码的选项,一般都置为默认,默认为null
3、加密类型
三、示例
DECLARE
input_string VARCHAR2(30) := '需要加密的内容';
raw_input RAW(128) := UTL_RAW.CAST_TO_RAW(input_string);
--将需要加密的内容转换成RAW格式
raw_key RAW(256);
encrypted_raw RAW(2048);
encrypted_string VARCHAR2(2048);
decrypted_raw RAW(2048);
decrypted_string VARCHAR2(2048); BEGIN
dbms_output.put_line('> ========= Get Key Bytes ========='); raw_key := dbms_crypto.randombytes(24);
--随机生成的48位字符密匙
dbms_output.put_line('> Key String length: ' || UTL_RAW.LENGTH(raw_key));
dbms_output.put_line('> Key String: ' || UTL_RAW.CAST_TO_VARCHAR2(raw_key));
dbms_output.put_line('> Input String: ' || input_string);
dbms_output.put_line('> ========= BEGIN TEST Encrypt =========');
--加密
encrypted_raw := dbms_crypto.Encrypt(src => raw_input,
typ => DBMS_CRYPTO.DES3_CBC_PKCS5,
key => raw_key); dbms_output.put_line('> Encrypted hex value : ' || rawtohex(UTL_RAW.CAST_TO_RAW(encrypted_raw)));
dbms_output.put_line('> Encrypted varchar2 value: ' || UTL_RAW.CAST_TO_VARCHAR2(encrypted_raw));
--解密
decrypted_raw := dbms_crypto.Decrypt(src => encrypted_raw,
typ => DBMS_CRYPTO.DES3_CBC_PKCS5,
key => raw_key);
--将解密后的RAW转换成String
decrypted_string := UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw); dbms_output.put_line('> Decrypted string output : ' || decrypted_string); if input_string = decrypted_string THEN
dbms_output.put_line('> String DES Encyption and Decryption successful');
END if;
END;
/ 运行脚本的结果:
> ========= Get Key Bytes =========
> Key String length: 24
> Key String: 峈报T??崛╭顋卖I~漥?篻
> Input String: 需要加密的内容
> ========= BEGIN TEST Encrypt =========
> Encrypted hex value : 374132424133453633303945433530364534414334443943303346343735303643464630393330313436454441443930
> Encrypted varchar2 value: z+f0炁洮M?魎橡?F憝 说明:
1、可以看到,用dbms_crypto.randombytes(24)生成的是24位的乱码
2、解密时必须提供加密时的Key,所以在使用加密时可以使用固定的复杂字符串。
四、自定义加解密函数 https://www.cnblogs.com/zhijiancanxue/p/12507828.html
1、加密
CREATE OR REPLACE FUNCTION F_ENCRYPT_DATA(NUMBER_IN IN VARCHAR2,
SECRETKEY IN VARCHAR2) RETURN RAW IS
NUMBER_IN_RAW RAW(128) := UTL_I18N.STRING_TO_RAW(NUMBER_IN, 'AL32UTF8');
KEY_NUMBER VARCHAR2(32) := SECRETKEY;
KEY_RAW RAW(128) := UTL_RAW.CAST_FROM_NUMBER(KEY_NUMBER);
ENCRYPTED_RAW RAW(128);
BEGIN
ENCRYPTED_RAW := DBMS_CRYPTO.ENCRYPT(SRC => NUMBER_IN_RAW,
TYP => DBMS_CRYPTO.DES_CBC_PKCS5,
KEY => KEY_RAW);
RETURN ENCRYPTED_RAW;
END;
2、解密
CREATE OR REPLACE FUNCTION F_DECRYPT_DATA(ENCRYPTED_RAW IN RAW,
SECRETKEY IN VARCHAR2)
RETURN VARCHAR2 IS
DECRYPTED_RAW RAW(128);
KEY_NUMBER VARCHAR2(32) := SECRETKEY;
KEY_RAW RAW(128) := UTL_RAW.CAST_FROM_NUMBER(KEY_NUMBER);
BEGIN
DECRYPTED_RAW := DBMS_CRYPTO.DECRYPT(SRC => ENCRYPTED_RAW,
TYP => DBMS_CRYPTO.DES_CBC_PKCS5,
KEY => KEY_RAW);
RETURN UTL_I18N.RAW_TO_CHAR(DECRYPTED_RAW, 'AL32UTF8');
END;
转自:https://www.cnblogs.com/pejsidney/articles/7066032.html、https://www.cnblogs.com/ZTPX/p/10762621.html
Oracle中的加解密函数的更多相关文章
- PHP 基础篇 - PHP 中 DES 加解密详解
一.简介 DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.密钥长度是64位(bit),超过位数密钥被忽略.所谓对 ...
- Oracle中的内置函数在sql中的转换整理
程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...
- 用sql语句导出oracle中的存储过程和函数
用sql语句导出oracle中的存储过程和函数: SET echo off ; SET heading off ; SET feedback off ; SPOOL 'C:/PRC.SQL' repl ...
- Oracle中生成随机数的函数(转载)
在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...
- oracle中110个常用函数介绍
1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dua ...
- Oracle中如何使用REGEXP_SUBSTR函数
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier) __srcst ...
- Oracle中如何使用REGEXP_SUBSTR函数动态截取字符串
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...
- oracle中next_day()、last_day()函数解析
oracle中next_day()函数解析 Sql代码 当前系统时间的下一星期一的时间select next_day(sysdate,1) from dual NEXT_DAY(date,char ...
- MD5+DES在C#.NET与Java/Android中的加解密使用
一.背景后台(C#.NET)使用一个MD5+DES的加解密算法,查了下,很多网友都使用了这个算法.在Android里,也需要这个算法,如何把这个加解密算法切换成Java版,成了难题.毕竟好久没涉及到这 ...
随机推荐
- Python3 装逼神器---词云(wordcloud)
词云 (Word Cloud)是对文本中出现频率较高的词语给予视觉化展示的图形, 是一种常见的文本挖掘的方法. 实例: 依赖包: # pip3 install wordcloud jieba ...
- uni-app(Vue)中(picker)用联动(关联)选择以至于完成某些功能
如下图所示,在项目中需求是通过首先选择学生的专业,选好之后在每个专业下面选择对应的学期,每个学期有对应的学费,因此就需要联动选择来实现这一功能. 以下仅展示此功能主要代码: <div class ...
- SkyWalking部署及.Net Core简单使用
SkyWalking官方网站非常详细,以下只是本人学习过程的整理 一.SkyWalking简介 1.概念 SkyWalking是分布式系统的应用程序性能监视工具,专为微服务.云原生架构而设计 SkyW ...
- 【Go语言学习笔记】为什么要选择Go语言
一门语言的兴起一定有他的原因,所谓天下苦Java久矣,Go的到来可以说很多后端开发的福音,尤其是在微服务.分布式这么火的今天,那么,他的优势到底是什么呢? 首先,我们需要现有后端语言的优势痛点: 其实 ...
- 攻防世界 WEB 高手进阶区 upload1 Writeup
攻防世界 WEB 高手进阶区 upload1 Writeup 题目介绍 题目考点 文件上传漏洞 一句话木马 中国菜刀类工具的使用 Writeup 使用burpsuite抓包 可见只是对上传文件的后缀进 ...
- #web开发# 知道cookie hostonly属性的请举手。
Cookie常见姿势.疑难梳理 目前w3c定义浏览器存放每个cookie需要包含以下字段: cookie属性 基本描述 举例 备注 name=value cookie键值对 id=a3fWa expi ...
- C#中base 和this
[意义] this:指当前类,this调用当前类的属性,方法,包括构造函数的方法,继承本类的构造函数 base:指当前类的父类,可调用父类的非私有属性,方法,继承父类的构造函数括号里的参数 [用处] ...
- [atAGC007E]Shik and Travel
二分枚举答案,判定答案是否合法 贪心:每一个叶子只能经过一遍,因此叶子的顺序一定是一个dfs序,即走完一棵子树中的所有叶子才会到子树外 根据这个贪心可以dp,设$f[k][l][r]$表示仅考虑$k$ ...
- SSM整合小项目
1.文件目录结构 2.MyBatis配置 创建数据库环境 CREATE DATABASE `ssmbuild`; USE `ssmbuild`; DROP TABLE IF EXISTS `books ...
- Apache ShardingSphere 5.0.0 内核优化及升级指南
经过近两年时间的优化和打磨,Apache ShardingSphere 5.0.0 GA 版终于在本月正式发布,相比于 4.1.1 GA 版,5.0.0 GA 版在内核层面进行了大量的优化.首先,基于 ...