【Oracle专栏】ORA-06502:hex到raw的转换错误

 Oracle相关文档,希望互相学习,共同进步

风123456789~-优快云博客


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-优快云博客

项目管理-项目绩效域1/2_八大绩效域和十大管理有什么联系-优快云博客

项目管理-项目绩效域2/2_绩效域 团不策划-优快云博客

高项-案例分析万能答案(作业分享)-优快云博客

项目管理-计算题公式【复习】_项目管理进度计算题公式:乐观-优快云博客

项目管理-配置管理与变更-优快云博客

项目管理-项目管理科学基础-优快云博客

项目管理-高级项目管理-优快云博客

项目管理-相关知识(组织通用治理、组织通用管理、法律法规与标准规范)-优快云博客


Oracle其他文档,希望互相学习,共同进步

Oracle-找回误删的表数据(LogMiner 挖掘日志)_oracle日志挖掘恢复数据-优快云博客

oracle 跟踪文件--审计日志_oracle审计日志-优快云博客

ORA-12899报错,遇到数据表某字段长度奇怪现象:“Oracle字符型,长度50”但length查却没有50_varchar(50) oracle 超出截断-优快云博客

EXP-00091: Exporting questionable statistics.解决方案-优快云博客

Oracle 更换监听端口-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值