Oracle相关文档,希望互相学习,共同进步
1.问题背景
同事反馈,使用Oracle加密没有问题,和Java处理的加密结果一致,但是加密后的字符串无法通过Oracle 函数解密,初步猜测应该是函数哪里写的有问题,导致格式转换有问题。
报错如下:ORA-06502:PL/SQL:数字或值错误:hex到raw的转换错误
select aes_decrypt (aes_encrypt ('142733196902275413')) from dual;
2. 问题分析
思路:1)先看加密函数和解密函数是否一致,加密用到的类型
2)查看具体的报错内容:应该是16进制格式不对,导致无法转换
发现:加密的步骤最后,用了base64编码,但是解密没有用到base64解码。
这里应该是问题所在。
用到的加减密函数如下:
1)加密函数
用到的加密函数:
CREATE OR REPLACE FUNCTION AES_ENCRYPT(P_INPUT VARCHAR2,P_KEY VARCHAR2:= 'thisisnhtcaespwd') RETURN varchar2 IS --这里注意位数,128是16位key,256需要32位key RAW_KEY RAW(32):= UTL_I18N.STRING_TO_RAW(p_key,'UTF8'); vAesString varchar2(200); BEGIN vAesString := P_INPUT; if LENGTH(trim(P_INPUT)) >= 7 and LENGTH(P_INPUT) <= 18 then vAesString := utl_raw.cast_to_varchar2(utl_encode.base64_encode( RAWTOHEX ( DBMS_CRYPTO.ENCRYPT ( SRC =>UTL_I18N.STRING_TO_RAW( P_INPUT,'UTF8'), TYP => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5, KEY => RAW_KEY, IV => RAW_KEY ) ))); end if; RETURN vAesString; END;
2)解密函数
用到的解密函数:
CREATE OR REPLACE FUNCTION AES_DECRYPT(P_INPUT VARCHAR2,P_KEY VARCHAR2:= 'thisisnhtcaespwd') RETURN VARCHAR2 IS RAW_KEY RAW(32):= UTL_I18N.STRING_TO_RAW(p_key,'UTF8'); BEGIN RETURN UTL_I18N.RAW_TO_CHAR ( DBMS_CRYPTO.DECRYPT--utl_raw.cast_to_raw(utl_encode.base64_decode(P_INPUT)) ( SRC => HEXTORAW(P_INPUT), TYP => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5, KEY => RAW_KEY, IV => RAW_KEY ) , 'UTF8' ); END;
3.修复验证
发现:加密的步骤最后,用了base64编码,但是解密没有用到base64解码。
这里应该是问题所在,修改解密函数:
修改后函数:
CREATE OR REPLACE FUNCTION AES_DECRYPT(P_INPUT VARCHAR2,P_KEY VARCHAR2:= 'thisisnhtcaespwd') RETURN VARCHAR2 IS RAW_KEY RAW(32):= UTL_I18N.STRING_TO_RAW(p_key,'UTF8'); BEGIN RETURN UTL_I18N.RAW_TO_CHAR ( DBMS_CRYPTO.DECRYPT ( SRC => HEXTORAW(utl_encode.base64_decode(utl_raw.cast_to_raw(P_INPUT))), TYP => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5, KEY => RAW_KEY, IV => RAW_KEY ) ,'UTF8'); END;
验证:
select aes_decrypt (aes_encrypt ('142733196902275413')) from dual;
实验验证:ok 
项目管理--相关知识
项目管理-项目绩效域1/2_八大绩效域和十大管理有什么联系-优快云博客
项目管理-计算题公式【复习】_项目管理进度计算题公式:乐观-优快云博客
项目管理-相关知识(组织通用治理、组织通用管理、法律法规与标准规范)-优快云博客
Oracle其他文档,希望互相学习,共同进步
Oracle-找回误删的表数据(LogMiner 挖掘日志)_oracle日志挖掘恢复数据-优快云博客
oracle 跟踪文件--审计日志_oracle审计日志-优快云博客
ORA-12899报错,遇到数据表某字段长度奇怪现象:“Oracle字符型,长度50”但length查却没有50_varchar(50) oracle 超出截断-优快云博客