@ORACLE通过utl_http传送加密数据实现第三方接口

ORACLE通过utl_http传送加密数据实现第三方接口

最近这个项目已经到了收尾阶段,再不总结就要忘记。抓紧时间出成品:
项目是一个三方接口,说到接口就离不开数据的收集、数据传送两个方面。
数据收集,有关客户机密这个先放一边暂且不讨论。
数据传送方面涉及两个方面,也是今天总结中的主体-HTTP请求、数据加密
这次的项目是把加密的各种数据转换函数溜了一遍,在各平台寻找资料时也碰到一些奇怪的现象:
公开代码没有交待测试环境–》这就导致有读者看到代码后无法实现代码的重写。
有些公开代码还算完整,有些就只是一些只言片语,看了真是一头雾水。
这就要各位读者朋友养成一双火眼金睛,能分辨出那些是可利用的,那些是不可利用的。
其中,也把自己踩过的坑记录下来,避免下次再踩进去。

另一个就是HTTP请求,它的整个流程如下:

1.建立连接:向服务器发送请求之前需要建立连接,通过DNS服务器创建套接字、建立连接、收发数据等操作查询ip地址,再建立socket连接。
2.发送请求:连接成功后,向Web服务器发送http消息格式的请求,包括get、post等命令。
3.响应、应答:web服务器收到请求后,从它的文档空间中搜索子目录index的文件index.html,并把其传送给web服务器,再将具体信息传递回浏览器。—第三方接收,响应并回复的一个过程。
4.关闭连接:Web浏览器与Web服务器断开,以保证其他Web浏览器能与Web服务器建立连接。
PROCEDURE RECEIVE_HTTP(p_addr_type in varchar2,p_json in varchar2, p_org_no in number, p_so_pos_no in varchar2, p_so_no in varchar2, p_job_start_pk_no in number, p_serial_no in number)
IS
PRAGMA autonomous_transaction;
REQ UTL_HTTP.REQ;
RESP UTL_HTTP.RESP;
VALUE VARCHAR2(32000);
v_url varchar2(2014);
v_tokens varchar2(256);
v_msg varchar2(3000) := null;
v_job_step_pk_no number := null;
v_job_end_pk_no number := null;
v_serial_no number;
send_failed_exception exception;
v_step number;
v_status_flg VARCHAR2(32);
BEGIN
v_url := get_webaddress(v_tokens,p_addr_type, p_json); --获得URL地址
utl_http.set_body_charset(‘UTF-8’);–解决接收返回值及信息乱码问题。
req := UTL_HTTP.BEGIN_REQUEST (url=> v_url,method => ‘POST’); --该参数代表请求包含POST数据
utl_http.set_header(req, ‘Keep-Alive’, ’ timeout=1’);–该参数代表超时,这里我并没用,主要是JOB间隔太近,没必要。
UTL_HTTP.SET_HEADER (r => req,name => ‘Content-Type’,VALUE => ‘application/json;charset=UTF-8’);
UTL_HTTP.SET_HEADER (r => req,name => ‘Content-Length’,VALUE => LENGTHB(p_json));
----该参数代表我发送的POST报文多长,不可少 。这里之所以使用LENGTHB而未使用LENGTH,是因为发现如果发送内容中有中文LENGTHB获得值才是正确的长度。
UTL_HTTP.WRITE_TEXT (r => req,data => p_json);
resp := UTL_HTTP.GET_RESPONSE(req);
UTL_HTTP.READ_text(resp,value );
–UTL_HTTP.READ_line(resp,value ,true); 这里之前使用read_line,出现ORA-29273: HTTP request failed ORA-06512: at “SYS.UTL_HTTP”, line 1355 ORA-06502: PL/SQL: numeric or value error等问题。
–后来查询发现read_line多与LOOP合用。多如下使用:
/LOOP
UTL_HTTP.READ_LINE ( resp, v_line, TRUE );
END LOOP;
/
IF INSTR(VALUE,‘“code”:“0”’)> 0 THEN
–pass
–add log
v_status_flg :=‘Y’;
ELSE
–error
–add log
–这里想使用一个异常,一直没找到适合的ORACLE内置的索性改个方法显示目的。
v_status_flg :=‘F’;
END IF;
UTL_HTTP.END_RESPONSE(resp);
EXCEPTION
when others then
–add log
rollback;
END RECEIVE_HTTP;

加密算法

接一下就是加密,何为加密?换个说法就是转码就像数字的表示方法有十进制、二进制一样,一个数字可用不同方法表示,只要解读者知道怎么解读就能准确的拿到相要的东西。
之前只使用过MD5,第三方加密方法和逻辑特别繁琐,这也使我接触多种加密算法。
Base64
实质是一种编码格式,如同UTF-8
是一种用64个字符来表示任意二进制数据的方法
可逆性
可以将图片等二进制文件转换为文本文件
可以把非ASCII字符的数据转换成ASCII字符,避免不可见字符
MD5
实质是一种散列表的计算方式
不可逆性。
任意长度的明文字符串,加密后得到的密文字符串是长度固定的。
SHA1
Sha1是一种密码散列函数,是一个用来进行数字签名的算法。这种算法通俗来说,就是接收一段明文,并以不可逆的方式转换成一段密文,通过密文无法知道原文是什么。
SHA1先对任意长度的明文进行分组,每一组的长度为512位,然后对这些明文分组反复重复处理。
AES
数据库中的数据如果是包含有敏感信息,或者需要对一些数据进行加密,为了方便数据库处理或者对数据表中已存在的原有的数据进行加密,则可以使用Oralce中的AES加密函数来进行数据的加密.
需要注意的是:无论是AES128与AES192都需要密钥。
如:AES128加密密钥key是16位,AES192加密密钥key是24位。
加密方式:
密钥位数:AES128 DBMS_CRYPTO.ENCRYPT_AES128
连接方式:CBC/ECB DBMS_CRYPTO.CHAIN_CBC/CHAIN_ECB
填充方式:PKCS5 DBMS_CRYPTO.PAD_PKCS5
function get_token( p_values in varchar2 , p_type in varchar2)
return varchar2
is
v_tokens varchar2(128);
----QR—
vs_key varchar2(128) :=‘A5d9X27ad047XXXXXfaa00cXX23’;
vs_data varchar2(20000);
vr_sha1_key1 raw(256); –
vr_sha1_key2 raw(256);
vs_aes_key varchar2(2000);
vr_aes_data raw(32000);
vr_base64_data raw(32000);
vs_target_data varchar2(32000);
vs_temp varchar2(30000);
begin
if p_type = ‘PRE’ then
select replace(replace(utl_raw.cast_to_varchar2(utl_encode.BASE64_ENCODE(utl_raw.cast_to_raw(p_values))), chr(13)),chr(10))
–BASE64,这里使用转换函数BASE64_ENCODE的函数的需要ROW类型,所以先转成ROW型,加密后再转为VARCHAR2型。replace的使用是为了截取掉换行和回车,chr(10) 换行 chr(13) 回车。
into v_tokens
from dual;
select lower(dbms_crypto.hash(utl_raw.cast_to_raw(v_tokens), dbms_crypto.HASH_SH1 )) --SHA1,lower的原因是由dbms_crypto.hash得到的值为大写,需要转换成小写。
into v_tokens
from dual;
return v_tokens;
elsif p_type = ‘QR’ then
–sha1 once for key
select dbms_crypto.hash(utl_raw.cast_to_raw(vs_key), dbms_crypto.HASH_SH1) into vr_sha1_key1 from dual;
vs_temp := replace(replace(utl_raw.cast_to_varchar2(vr_sha1_key1),chr(10)),chr(13));
–sha1 twice for key
select dbms_crypto.hash(utl_raw.cast_to_raw(vs_temp), dbms_crypto.HASH_SH1) into vr_sha1_key2 from dual;
vs_temp := replace(replace(utl_raw.cast_to_varchar2(vr_sha1_key2),chr(10)),chr(13));-- 经过两次加密获得KEY串
–get 1-16 chars as aes_key
select substrb(utl_raw.cast_to_varchar2(vr_sha1_key2),1,16) into vs_aes_key from dual; --通过截取之前的KEY串,获得16位KEY
–get aes_text
vr_aes_data := dbms_crypto.encrypt(utl_raw.cast_to_raw(p_values),dbms_crypto.encrypt_aes128+dbms_crypto.chain_ecb+dbms_crypto.pad_pkcs5,utl_raw.cast_to_raw(vs_aes_key)); --AES128
–get base64_encoded data
vr_base64_data := utl_encode.base64_encode(vr_aes_data);
–get urlencode data
vs_target_data := utl_url.escape(replace(replace(utl_raw.cast_to_varchar2(vr_base64_data),chr(10)),chr(13)),TRUE,‘UTF8’);
return vs_target_data;
end if;
end;
附:
加密方式选择:
Oracle官方给出的选择有:

ORACLE通过utl_http传送加密数据实现第三方接口相关推荐

  1. 前端请求接口post_程序员:HttpClient进行post请求的工具类,访问第三方接口HTTPS...

    HTTPS (英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure) 是一 ...

  2. Java 调用第三方接口,实战来了!

    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 1.准备工作: 在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的restTem ...

  3. QQ登录第三方接口研究(1)----协议要点

    此文内容摘抄自QQ登录的协议,因为要写QQ登录的第三方接口,所以第一件事就是认真研究协议,所以把重点和要点摘抄出来了.基本是按原文写的,不过有些地方是按个人理解写的,所以如果真要做这方面的接口,还是到 ...

  4. Java调用第三方接口示范

    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 使用流程 [1]准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的re ...

  5. Java 调用第三方接口方法

    Java 调用第三方接口方法 一. 通过JDK网络类Java.net.HttpURLConnection 1.java.net包下的原生java api提供的http请求 使用步骤: 1.通过统一资源 ...

  6. Java连接第三方接口获取数据

    第一步 pom文件添加如下依赖 <!--HttpClient--><dependency><groupId>commons-httpclient</group ...

  7. PHP向第三方接口发送json数据

    2019独角兽企业重金招聘Python工程师标准>>> 开发项目中,遇到需要向第三方接口发送json数据数据的情况,php默认发送数据形式为text,需要告诉第三方接口数据形式为js ...

  8. 使用mock解决测试中依赖第三方接口的问题

    使用mock解决测试中依赖第三方接口的问题 参考文章: (1)使用mock解决测试中依赖第三方接口的问题 (2)https://www.cnblogs.com/wbw-test/p/11977335. ...

  9. http方式调用第三方接口

    java如何调用对方http接口(II) - 流年煮雪 - 博客园 纯Java api HttpURLConnection Java调用外部接口_CJD的博客-CSDN博客_调用外部接口 纯Java  ...

最新文章

  1. 清华博士接亲被要求现场写代码,网友:真是面向对象编程!
  2. 如何测服务器网站带宽,windows服务器如何测试带宽速度?
  3. 研发日烧6400万的百度发出新讯号,李彦宏:自动驾驶订单已是全球第一
  4. python登录验证码(基于django框架)
  5. 当我们在谈深度学习时,到底在谈论什么(三)--转
  6. GDCM:串联/提取DICOM文件的测试程序
  7. Python学习之路day03——010函数(类似Java中的方法)
  8. API网关—Spring Cloud Zuul
  9. 数学--数论--HDU 6128 Inverse of sum (公式推导论)
  10. 真实,让文学回到原点:关于非虚构写作的思考
  11. 《构建之法》 读书笔记
  12. php defunct,通过swoole观察僵尸进程和孤儿进程出现和消亡
  13. 飞鸽传书转载:老板的忠告
  14. 美化type=file控件
  15. Java分布式锁看这篇就够了,java基础面试笔试题
  16. 域名被封(微信)后的思索
  17. 计算机邮件合并应用测试怎么做,四大实例干货:word邮件合并功能步骤详解教程...
  18. Spring boot yml的格式
  19. 初中生物教师资格证经验贴
  20. UBUNTU下安装热键驱动及触摸板禁用驱动

热门文章

  1. C + + 课程设计之服装信息管理系统。①代码分析(含有源码)
  2. UEFI启动和Bios(Legacy)启动的区别
  3. mac外接显示器 竖屏 黑苹果_借人气问一个黑苹果外接显示器的问题
  4. [buuctf] crypto全解——前84道(不建议直接抄flag)
  5. java学习四个月以来的想法
  6. ipad分屏_Ipad使用技巧大总结。
  7. 关于快排算法的基本实现
  8. 香港大学SPACE中国商业学院暨企业研究院第三届创新创业大赛全国总决赛圆满收官
  9. iPhone连接Mac之后频繁闪烁的解决方法
  10. [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题