当前位置: 首页 > news >正文

【PB续命02】Oracle中加密及编码等

Oracle中实现Md5/Base64/Aes+Base64/UrlEncode等加密编码的使用备忘,参考其它人的贴子,Oracle 11g 亲测有效。

1. Oracle中实现Md5加密

SELECT lower(MD5('白龙马5217')) FROM dual;
--返回结果 72853926982028ab8219921ad2918b8f
--或 
select  utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => '白龙马5217')) from dual
--返回结果 72853926982028AB8219921AD2918B8F

2. Oracle中实现Base64编码/解码

--2.1.编码:
select utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('白龙马5217'))) from dual
-- 输出: sNfB+sLtNTIxNw== 
--2.2. 解码:
select (utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw('sNfB+sLtNTIxNw==')))) as 结果 from dual
-- 输出: 白龙马5217

3. Oracle中实现UrlEncode和UrlDecode

-- 3.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;
-- 3.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
-- 3.3. 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用户as SYSDBA,执行授权,如果不想公开public,也可指定要授权的用户,如blma  
--		conn / as sysdba 
grant execute on sys.dbms_crypto to public; --需要管理员角色登录才能执行
grant execute on sys.UTL_I18N to public;-- 	*** 注意 ***: 授权完成,切换自己的用户
--    conn / as Normal
-- 4.2. 创建加密函数 ==> Aes+Base64
CREATE OR REPLACE FUNCTION fn_EnAes64(as_ysj IN VARCHAR2,as_key In Varchar2)
RETURN VARCHAR2
ISencrypted_raw      RAW (2000);                                     -- 储存加密后的字节key_bytes_raw      RAW (16);                                       -- 储存秘钥 128比特 (16位)-- 我这里的Aes加解密方式为: AES/ECB/PKCS5Padding ,  自己可自由组合,如:AES/ECB/PKCS5Padding等等encryption_type    PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5 ; iv_raw             RAW (16);                               -- 向量
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加密,如果只要aes,不需要base64,则此步注释跳过即可encrypted_raw := utl_encode.base64_encode(r => encrypted_raw);return UTL_I18N.RAW_TO_CHAR (encrypted_raw, 'AL32UTF8');
END;-- 4.3. 创建解密函数 ==> Aes+Base64
CREATE OR REPLACE FUNCTION fn_DeAes64(as_ysj IN VARCHAR2, as_key IN VARCHAR2)
RETURN VARCHAR2
ISdecrypted_raw      RAW (2000);                                     -- 储存解密后的字节key_bytes_raw      RAW (16);                                       -- 储存秘钥 128比特 (16位)-- 我这里的Aes加解密方式为: AES/ECB/PKCS5Padding ,  自己可自由组合,如:AES/ECB/PKCS5Padding等等encryption_type    PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5 ; 	iv_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);-- 将加密后字符串转为rowdecrypted_raw  := utl_raw.cast_to_raw(c => as_ysj);-- Base64解密, 如果源字符串仅aes加密,没有base64编码,则此步注释跳过即可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.4. 应用示例,密钥只能为16位
select fn_enaes64('白龙马5217','blma5217blma5217') from dual
--加密后的结果: mV4aaEnbaEllRvpH5WSiyw==
select fn_deaes64('mV4aaEnbaEllRvpH5WSiyw==','blma5217blma5217') from dual
--解密后的结果: 白龙马5217

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

--5.1.sys授权、创建Aes加密、Aes解密方法
--  登录sys用户,执行授权,如果不想公开public,也可指定要授权的用户,如scott    
--    conn / as sysdba 
grant execute on sys.dbms_crypto to public;
grant execute on sys.UTL_I18N to public;--   *** 注意 ***: 授权完成,切换自己的用户
-- 5.2.加密函数
CREATE OR REPLACE FUNCTION FN_ENAES192(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;-- 5.3. 解密函数
CREATE OR REPLACE FUNCTION FN_DEAES192(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.4. Aes192加密/解密使用实例
select -- 加密字符串:白龙马5217 Key: 0123456789abcd0123456789FN_ENAES192('白龙马5217','0123456789abcd0123456789')    -- 加密
from dual;
--加密结果: 7A868850953737C8F0DB44E8B1D14C12select -- 解密字符串: 7A868850953737C8F0DB44E8B1D14C12   key: 0123456789abcd0123456789FN_DEAES192('7A868850953737C8F0DB44E8B1D14C12','0123456789abcd0123456789')   -- 解密
from dual;
--解密结果: 白龙马5217

6. 实现Des算法加密解密

DES加解密算法的明文和密钥长度必须为8的倍数。

6.1 DES加密String类型

create or replace function FN_ENDES_STRING(input8x in varchar2,key8x in varchar2) return varchar2 isRetuenResult varchar2(4000);encrypted_str VARCHAR2(4000);begin--input_string 和 key_string 的长度必须是8的倍数dbms_obfuscation_toolkit.desencrypt(input_string => input8x, key_string => key8x, encrypted_string => encrypted_str);--RetuenResult := utl_raw.cast_to_raw(encrypted_str);RetuenResult := encrypted_str;return(RetuenResult);
end FN_ENDES_STRING;

FN_ENDES_STRING()应用示例

select fn_endes_string('BLMA5217','12345678') from dual
--返回结果:AFAC8E02619B59E0

6.2 DES解密String类型

create or replace function FN_DEDES_STRING(encrypted_str in varchar2,key8x in varchar2) return varchar2 is-- encrypted_str为FN_ENDES_STRING()的返回值-- key_string 的长度必须是8的倍数RetuenResult varchar2(4000);decrypted_str VARCHAR2(4000);
begindbms_obfuscation_toolkit.desdecrypt(input_string => utl_raw.cast_to_varchar2(encrypted_str), key_string => key8x, decrypted_string => decrypted_str);RetuenResult := decrypted_str;return(RetuenResult);
end FN_DEDES_STRING;

FN_DEDES_STRING()应用示例

select fn_dedes_string('AFAC8E02619B59E0','12345678') from dual
--返回结果:BLMA5217

6.3 DES加密Raw类型

create or replace function FN_ENDES_RAW(input8x in varchar2,key8x in varchar2) return varchar2 is
--input_string 和 key_string 的长度必须是8的倍数RetuenResult varchar2(4000);encrypted_raw RAW(4000);decrypted_raw RAW(4000);
begindbms_obfuscation_toolkit.desencrypt(input => utl_raw.cast_to_raw(input8x), key => utl_raw.cast_to_raw(key8x), encrypted_data => encrypted_raw);RetuenResult := rawtohex(encrypted_raw);return(RetuenResult);
end FN_ENDES_RAW;

FN_ENDES_RAW()应用示例

select fn_endes_raw('BLMA5217','12345678') from dual
--返回结果:AFAC8E02619B59E0

6.4 DES解密Raw类型

create or replace function FN_DEDES_RAW(encrypted_raw in varchar2,key8x in varchar2) return varchar2 is
-- encrypted_raw 为FN_ENDES_RAW()的返回值
-- key_string 的长度必须是8的倍数RetuenResult varchar2(4000);decrypted_raw RAW(4000);
begindbms_obfuscation_toolkit.desdecrypt(input => encrypted_raw, key => utl_raw.cast_to_raw(key8x), decrypted_data => decrypted_raw);RetuenResult := utl_raw.cast_to_varchar2(decrypted_raw);return(RetuenResult);
end FN_DEDES_RAW;

FN_ENDES_RAW()应用示例

select fn_dedes_raw('AFAC8E02619B59E0','12345678') from dual
--返回结果:BLMA5217

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

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

如需要其它加密算法可自己查阅。

(完)

相关文章:

【PB续命02】Oracle中加密及编码等

Oracle中实现Md5/Base64/AesBase64/UrlEncode等加密编码的使用备忘,参考其它人的贴子,Oracle 11g 亲测有效。 1. Oracle中实现Md5加密 SELECT lower(MD5(白龙马5217)) FROM dual; --返回结果 72853926982028ab8219921ad2918b8f --或 select utl_raw.…...

STM32-LTC6804方案成熟BMS方案

方案下载链接!!https://mp.weixin.qq.com/s?__bizMzU2OTc4ODA4OA&mid2247549092&idx1&snc73855c4e3d5afddd8608d8528864f95&chksmfcfb1373cb8c9a65a4bd1f545a1a587af882f209e7ccbb8944f4d2514d241ca1d7fcc4615e10&token539106225&a…...

一步一步认知机器学习

1,前言 之前学习并且实操了一些算法框架用来探索相关方向的可能性,但是总不了解相关的步骤。因为一步一步按照别人给出的步骤去操作,解决一些操作时出现的问题,基本可以达到目的。但是这个也基本限制了在那个框架而已。对于算法还…...

现代C++、STL、QTL的使用

0、现代C中最重要的是&#xff1a; 右值引用&&、移动语义std::move、完美转发std::forward、万能引用T&& void Func(int& x) { cout << "左值引用" << endl; } void Func(const int& x) { cout << "const左值引用…...

Android 备案公钥、签名 MD5获取方法

公钥和 MD5 值可以通过安卓开发工具、Keytool、Jadx-GUI 等多种工具获取&#xff0c;本文以 jadx-gui 为例。 1 windows 下载 jadx-gui 工具 下载 jadx-gui 工具 在这里选择一个下载 下载后 解压文件 双击运行程序&#xff0c;然后选择 release apk安装包 2 Mac 打开终端&a…...

1688拍立淘接口,按图搜索商品接口,图片识别接口,图片上传搜索接口,图片搜索API接口,以图搜货接口

1688拍立淘接口的作用是让用户通过上传图片或输入图片链接的方式&#xff0c;调用1688的图片搜索引擎&#xff0c;返回与该图片相关的所有1688商品。 使用该接口需要先获取一个key和secret&#xff0c;然后参考API文档里的接入方式和示例&#xff0c;查看测试工具是否有需要的…...

H3C AC通过Web平台进行AC软件的升级?

软件升级的流程 1、获取软件版本 登录新华三官网&#xff08;首页>产品支持与服务>文档与软件>软件下载&#xff09;&#xff0c;将指定的软件版本下载至本地。 无线路由器-无线接入点-无线控制器-新华三集团-H3C 官网软件下载公共账号密码&#xff1a;账号&#x…...

网络通信和tcp协议

一、计算机网络架构模型 1、OSI七层模型 2、TCP/IP模型 3、TCP/IP协议族 无论是什么网络模型&#xff0c;都是为上一层提供服务&#xff0c;抽象层建立在低一层提供的服务上&#xff0c;每层都对应不同的协议 4、地址和端口号 1&#xff09;MAC地址 MAC 地址共 48 位&#…...

React 核心与实战2023版

课程亮点: 完整的前后台项目(PC+移动;完成业务;)React 最新企业标准技术栈(React 18 + Redux + ReactRouter + AntD)React + TypeScript (为大型项目奠定了基础)课程内容安排: React 介绍 React 是什么? React 是由Meta公司研发,是一个用于 构建Web和原生交互界面…...

在 Android 上测试 Kotlin 协程

文章目录 官方文档在测试中调用挂起函数TestDispatchersStandardTestDispatcherUnconfinedTestDispatcher 注入测试调度程序设置主调度程序在测试之外创建调度程序创建您自己的 TestScope注入作用域 官方文档 https://developer.android.google.cn/kotlin/coroutines/test?hl…...

图论04-【无权无向】-图的广度优先遍历BFS

文章目录 1. 代码仓库2. 广度优先遍历图解3.主要代码4. 完整代码 1. 代码仓库 https://github.com/Chufeng-Jiang/Graph-Theory 2. 广度优先遍历图解 3.主要代码 原点入队列原点出队列的同时&#xff0c;将与其相邻的顶点全部入队列下一个顶点出队列出队列的同时&#xff0c;将…...

vue3 v-model的使用

&#x1f642;博主&#xff1a;锅盖哒 &#x1f642;文章核心&#xff1a;vue3 v-model的使用 目录 前言 什么是v-model&#xff1f; 基本的v-model用法 自定义组件中的v-model 前言 当涉及到Vue.js 3的前端开发时&#xff0c;v-model是一个不可或缺的工具&#xff0c;它…...

Ubuntu 20.04 安装 Docker

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 介绍 Docker容器具有以下三大特点&#xff1a; 轻量化&#xff1a;一台主机上运行的多个Dock…...

vue el-dialog弹出框自定义指令实现拖拽改变位置-宽度-高度

前言 在实际开发中我们经常使用el-dialog弹出框做表单&#xff0c;一般情况都是居中。遮挡到了一部分数据 当我们想要查看弹出框下面的数据时&#xff0c;就只能先把弹出框关闭&#xff0c;查看完数据之后在打开弹框 我们通过动态样式&#xff0c;和鼠标事件就可以实现。但自…...

玄铁C906——物理内存保护(PMP)介绍

1、前言 &#xff08;1&#xff09;本文描述的是玄铁C906的物理内存保护机制的实现中&#xff0c;与RISC-V架构手册中完整PMP机制的差异部分&#xff1b; &#xff08;2&#xff09;RISC-V架构的PMP机制&#xff0c;参考博客&#xff1a;《RISC-V架构——物理内存属性和物理内存…...

【进阶C语言】编译与链接、预处理符号详解

目录 一、翻译环境 编译 1.预编译&#xff08;预处理&#xff09; 2.编译 3.汇编 链接 二、运行环境 三、预处理符号详解 1.预定义符号 2.#define 3.#undef 4..命令行定义 5.条件编译 6.头文件包含 代码是怎么变成可执行程序的&#xff1f; 一、翻译环境 翻译环境…...

spring.profiles生效顺序

服务在不同环境启动&#xff0c;需要的运行参数可能会有差异&#xff0c;不同启动环境也可能公用同一份运行参&#xff0c;为了方便对这些不同环境相同和差异参数进行管理&#xff0c;springboot提供了文件配置化形式对这些参数进行管理&#xff0c;对于不同环境的差异化参数使…...

【经典PageRank 】02/2 算法和线性代数

系列前文&#xff1a;【经典 PageRank 】01/2 PageRank的基本原理-CSDN博客 一、说明 并非所有连接都同样重要&#xff01; 该算法由 Sergey 和 Lawrence 开发&#xff0c;用于在 Google 搜索中对网页进行排名。基本原则是重要或值得信赖的网页更有可能链接到其他重要网页。例…...

【微客云】91优惠话费充值API接口开发功能介绍

话费充值接口文档 接口版本&#xff1a;1.0 ―、引言 文档概述 本文档提供话费充值接口规范说明&#xff0c;提供一整套的完整的接入示例(http 接口)供商户参 考&#xff0c;可以帮助商户开发人员快速完成接口开发与联调&#xff0c;实现与话费充值系统的交易互联。 公司官网…...

Kubernetes - 一键安装部署 K8S(附:Kubernetes Dashboard)

问题描述 不知道大伙是如何安装 K8s&#xff0c;特别还是集群的时候&#xff0c;我上一次安装搭建的时候&#xff0c;那个恶心到我了&#xff0c;真的是一步一个脚印走完整个搭建流程&#xff0c;爬了不少坑。 于是&#xff0c;才有了今天的文章&#xff0c;到底有没有可以一…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...