Oracle中实现Md5/Base64/Aes+Base64/UrlEncode等加密编码的使用备忘

news/2024/10/31 5:33:25/

文章目录

  • Oracle中实现Md5/Base64/Aes+Base64/UrlEncode等加密编码的使用备忘
    • 1. Oracle中实现Md5
    • 2. Oracle中实现Base64加密/解密
    • 3. Oracle中实现UrlEncode和UrlDecode
    • 4. Oracle中实现Aes + Base64:加密/解密 [Aes的Key为16位]
      • 4-1 sys授权、创建Aes+Base64加密、Aes+Base64解密方法
      • 4-2 Aes加密/解密使用实例
    • 5. Oracle中实现Aes192加密/解密 [Key为24位]
      • 5-1 sys授权、创建Aes加密、Aes解密方法
      • 5-2 Aes192加密/解密使用实例
    • 6. DES算法加密解密
    • 7. Oracle10以后的通用加密/解密 ==> dbms_crypto

Oracle中实现Md5/Base64/Aes+Base64/UrlEncode等加密编码的使用备忘

1. Oracle中实现Md5

-- 1. 直接使用一条Sql获取
select  utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => 'Testabc中文1223')) from dual -- 返回:2BFB3DFD34C6D014503E19430A97A013-- 2-1 创建方法fn_MD5
CREATE OR REPLACE FUNCTION fn_MD5(
passwd IN VARCHAR2)
RETURN VARCHAR2
ISretval varchar2(32);
BEGINretval := utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd)) ;RETURN retval;
END;-- 2-2 方法的使用实例:
select fn_MD5('Testabc中文1223') from dual; -- 返回:2BFB3DFD34C6D014503E19430A97A013

2. Oracle中实现Base64加密/解密

-- 1. 加密
select utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('加密的内容'))) from dual-- 输出: vNPD3LXExNrI3Q==-- 2. 解密:
select (utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw('vNPD3LXExNrI3Q==')))) as 结果 from dual-- 输出: 加密的内容

3. Oracle中实现UrlEncode和UrlDecode

-- 1-1 UrlEncode ,创建方法如下:
CREATE OR REPLACE FUNCTION url_encode(urlEncode IN VARCHAR2)RETURN VARCHAR2 AS
BEGIN--utl_url.escape()该方法只能在函数中调用RETURN utl_url.escape(urlEncode, TRUE, 'utf-8');
END;-- 1-2 UrlEncode使用实例:
SELECT url_encode('http://www.cnblogs.com/Marydon20170307?param=测试URL编码') FROM DUAL;-- 输出: http%3A%2F%2Fwww.cnblogs.com%2FMarydon20170307%3Fparam%3D%E6%B5%8B%E8%AF%95URL%E7%BC%96%E7%A0%81-- 2 UrlDecode ,直接使用一条Sql即可:
SELECT utl_url.unescape('待进行Url解码的字符串','utf-8') FROM DUAL;
-- 实例:
SELECT utl_url.unescape('http%3A%2F%2Fwww.cnblogs.com%2FMarydon20170307%3Fparam%3D%E6%B5%8B%E8%AF%95URL%E7%BC%96%E7%A0%81','utf-8') FROM DUAL;-- 输出:http://www.cnblogs.com/Marydon20170307?param=测试URL编码

4. Oracle中实现Aes + Base64:加密/解密 [Aes的Key为16位]

4-1 sys授权、创建Aes+Base64加密、Aes+Base64解密方法

-- 1. 登录sys用户,执行授权,如果不想公开public,也可指定要授权的用户,如scott    
--		conn / as sysdba 
grant execute on sys.dbms_crypto to public;
grant execute on sys.UTL_I18N to public;-- 	*** 注意 ***: 授权完成,切换自己的用户
-- 2-1. 创建加密函数 ==> Aes+Base64
CREATE OR REPLACE FUNCTION fn_EnAes64(as_ysj IN VARCHAR2,as_key In Varchar2)
RETURN VARCHAR2
ISencrypted_raw      RAW (2000);                                     -- 储存加密后的字节decrypted_raw      RAW (2000);                                     -- 储存解密后的字节key_bytes_raw      RAW (16);                                       -- 储存秘钥 128比特 (16位)encryption_type    PLS_INTEGER := 4868;                           -- 加密方式 AES/CBC/PKCS5Paddingiv_raw             RAW (16);                               -- 向量temp               varchar2(1000);                         -- 临时,AES加密并Base64后的结果BEGIN-- 秘钥key_bytes_raw := UTL_I18N.STRING_TO_RAW(as_key,'AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);-- 向量iv_raw        := UTL_I18N.STRING_TO_RAW('9iuj87y2hbi5wxl1','AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (16);-- 加密过程encrypted_raw := DBMS_CRYPTO.ENCRYPT(src => UTL_I18N.STRING_TO_RAW (as_ysj,  'AL32UTF8'),typ => encryption_type,key => key_bytes_raw,iv  => iv_raw);-- Bas64  加密encrypted_raw := utl_encode.base64_encode(r => encrypted_raw);-- 密文temp := utl_raw.cast_to_varchar2(r => encrypted_raw);-- 密文decrypted_raw  := utl_raw.cast_to_raw(c => temp);return UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
END;-- 2-2. 创建解密函数 ==> Aes+Base64
CREATE OR REPLACE FUNCTION fn_DeAes64(as_ysj IN VARCHAR2, as_key IN VARCHAR2)
RETURN VARCHAR2
ISencrypted_raw      RAW (2000);                                     -- 储存加密后的字节decrypted_raw      RAW (2000);                                     -- 储存解密后的字节key_bytes_raw      RAW (16);                                       -- 储存秘钥 128比特 (16位)encryption_type    PLS_INTEGER := 4868;                           -- 加密方式 AES/CBC/PKCS5Paddingiv_raw             RAW (16);                               -- 向量temp               varchar2(1000);                         -- 临时,AES加密并Base64后的结果
BEGIN-- 秘钥key_bytes_raw := UTL_I18N.STRING_TO_RAW( as_key,'AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);-- 向量iv_raw        := UTL_I18N.STRING_TO_RAW('9iuj87y2hbi5wxl1','AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (16);-- Base64 解密decrypted_raw  := utl_raw.cast_to_raw(c => as_ysj);decrypted_raw := utl_encode.base64_decode(r => decrypted_raw);-- Aes解密decrypted_raw := DBMS_CRYPTO.DECRYPT(src => decrypted_raw,typ => encryption_type,key => key_bytes_raw,iv  => iv_raw);temp := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');RETURN temp;
END;

4-2 Aes加密/解密使用实例

select -- 加密字符串: 1233211234567                  Key: 1234567890123456fn_EnAes64('123','1234567891234567'),  	                      -- Aes + Base64 加密-- 解密字符串: NjOpyoGM2i3gnx+AD8JLPg==       key: 1234567890123456fn_DeAes64('NjOpyoGM2i3gnx+AD8JLPg==','1234567891234567')     -- Aes+base64解密
from dual;
-- 输出结果行如下: -- 1	NjOpyoGM2i3gnx+AD8JLPg==	123

5. Oracle中实现Aes192加密/解密 [Key为24位]

5-1 sys授权、创建Aes加密、Aes解密方法

-- 1. 登录sys用户,执行授权,如果不想公开public,也可指定要授权的用户,如scott    
--		conn / as sysdba 
grant execute on sys.dbms_crypto to public;
grant execute on sys.UTL_I18N to public;-- 	*** 注意 ***: 授权完成,切换自己的用户
-- 2-1 加密函数
CREATE OR REPLACE FUNCTION FUN_ENCRYPTION(V_STR VARCHAR2 ,V_KEY VARCHAR2
)RETURN VARCHAR2
ASV_KEY_RAW RAW(24) ;V_STR_RAW RAW(2000) ;V_RETURN_STR VARCHAR2(2000) ;V_TYPE PLS_INTEGER ;
BEGINV_KEY_RAW := UTL_I18N.STRING_TO_RAW(V_KEY,'UTF8') ;V_STR_RAW := UTL_I18N.STRING_TO_RAW(V_STR,'UTF8') ;V_TYPE := DBMS_CRYPTO.ENCRYPT_AES192+DBMS_CRYPTO.CHAIN_CBC+DBMS_CRYPTO.PAD_PKCS5 ;V_STR_RAW := DBMS_CRYPTO.ENCRYPT(SRC => V_STR_RAW , typ => V_TYPE, key => V_KEY_RAW) ;V_RETURN_STR := RAWTOHEX(V_STR_RAW);RETURN V_RETURN_STR ;
END;-- 2-2 解密函数
CREATE OR REPLACE FUNCTION FUN_DECRYPTION(V_STR VARCHAR2 ,V_KEY VARCHAR2
)RETURN VARCHAR2
ASV_KEY_RAW RAW(24) ;V_STR_RAW RAW(2000) ;V_RETURN_STR VARCHAR2(2000) ;V_TYPE PLS_INTEGER ;
BEGINV_KEY_RAW := UTL_I18N.STRING_TO_RAW(V_KEY,'UTF8') ;V_STR_RAW := HEXTORAW(V_STR);V_TYPE := DBMS_CRYPTO.ENCRYPT_AES192+DBMS_CRYPTO.CHAIN_CBC+DBMS_CRYPTO.PAD_PKCS5 ;V_STR_RAW := DBMS_CRYPTO.DECRYPT(SRC => V_STR_RAW , typ => V_TYPE, key => V_KEY_RAW ) ;V_RETURN_STR := UTL_I18N.RAW_TO_CHAR(V_STR_RAW,'UTF8');RETURN V_RETURN_STR ;
END;

5-2 Aes192加密/解密使用实例

select -- 加密字符串:123   Key: 123456789qwertyuio098765FUN_ENCRYPTION('123','123456789qwertyuio098765'),		-- 加密-- 解密字符串: 1CBB1B9AB9500134F1DDF030B712AA57   key: 123456789qwertyuio098765FUN_DECRYPTION('1CBB1B9AB9500134F1DDF030B712AA57','123456789qwertyuio098765')   -- 解密
from dual;

6. DES算法加密解密

DECLAREv_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;

7. Oracle10以后的通用加密/解密 ==> dbms_crypto

说明:
dbms_crypto包默认只有sysdba用户才可执行,
其他任何用户都需要sysdba进行授权 conn / as sysdba;
  sys> grant execute on dbms_crypto to scott;

-- dbms_crypto包默认只有sysdba用户才可执行,其他任何用户都需要sysdba进行授权
--	sys>grant execute on dbms_crypto to scott;-- 示例(不考虑BLOB类型的加密)
DECLAREv_str VARCHAR2(20) := '12345678'; 				-- 加密的字符串v_type PLS_INTEGER := dbms_crypto.DES_CBC_PKCS5;  -- 加密类型 ,可自由搭配v_key RAW(256);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;

http://www.ppmy.cn/news/382978.html

相关文章

BB84协议:量子秘钥分发

文章目录 为什么需要量子密钥分发通讯工具基本通讯 BB84协议为什么这样做能防止通讯被窃听?在传统信道上的窃听在量子信道上的窃听 内容来源: 为什么需要量子密钥分发 BB84协议是一种“密钥分发协议”,所以从功能上来讲,它要实现的目标与之…

Spring MVC拦截器Interceptor使用(判断用户登录)

文章目录 一 概念二 3步使用三 HandlerInterceptor接口四 代码实现 一 概念 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验…

6.11 有名管道和无名管道

目录 进程间通讯介绍 System V IPC 无名管道 无名管道特点 无名管道创建-pipe 无名管道通信 无名管道-示例 有名管道特点 有名管道创建-mkfifo 有名管道读写-示例 进程间通讯介绍 无名管道(pipe) 有名管道 (fifo) 信号…

2023年5月电子学会真题图片缺失

各位粉丝儿: 因CSDN图片上传出现问题,很多5月的试卷缺失图片,已经反馈给CSDN,修复时间不确定,如需真题试卷,可私聊。 一个不太正经的编程老师

管理类联考——逻辑——知识篇——第四章 联言、选言(且、或)(5题,必考)

第四章 联言、选言(且、或)(5题,必考) 一、联言命题 联言命题是反映事物的若干种情况或者性质同时存在的复合命题 1.常见表达形式:A且B⟺即A又B⟺AB⟺虽然A但是B(语气强调B,逻辑是…

【word wps文字】目录页码中的格式在打印或打印预览时变为和正文页码格式一样,如何调整?

一、问题背景 之前在闲鱼上,有个人找我改word排版,有一个需求就是正文页码两边需要横杠。 但是目录中显示的页码,不需要横杠。 我当时是一个一个在目录中删除横杠的,借助了查找与替换功能。 更改后,目录页码如下所…

投资理财-家庭和谐最重要

快到年底了,大家总结一年投资经验和记录,亏损的也不要齐磊,只要股票数量在,未来有一天总会涨起来的,坚持住。 如果是背着家庭成员去进行赌的,亏损的,老实交代,求取家人谅解了&#…

家庭心理教育

随着独生子女的普及,生活水平的提高,独生子女的家庭教育出现了这样那样的问题。最为明显的是家长对子女的百般溺爱和过多保护,对孩子提出的要求都想方设法给以满足,久而久之,孩子便形成一种理被包容、被关爱、被保护的…