You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle执行BASE64解码3DES解密脚本报ORA-28817错误如何解决

错误原因
  • 密钥长度不符合3DES算法要求:3DES算法要求密钥长度必须为16字节(双密钥模式)或24字节(三密钥模式),示例脚本中密钥由字符串xxx转换而来,仅3字节,长度完全不符合要求,是触发错误的核心原因之一。
  • CBC加密模式缺少IV(初始化向量)参数:脚本指定了CHAIN_CBC链式模式,该模式加解密都需要传入和加密时一致的IV参数,但示例中调用DBMS_CRYPTO.DECRYPT时只传入了密文、算法类型、密钥三个参数,缺少必填的IV参数。
  • 次要可能:密文的Base64编码不合法,比如示例中密文开头的反斜杠如果是多余转义字符,会导致Base64解码得到的密文格式错误,也会触发解密失败。
修复方案
  • 修正密钥:替换xxx为和加密端完全一致的密钥,确保密钥字符串长度为16位或24位,转换为RAW后长度符合3DES要求。
  • 补充IV或调整加密模式:
    • 如果确认加密时使用的是CBC模式,获取加密时使用的IV值,转换为RAW后作为第四个参数传入DECRYPT函数,示例代码调整如下:
DECLARE
    ciphertext           VARCHAR2(100) := 'am2cZofWi5vGz3Zk1qzqXcZuLK8Fqso'; -- 删掉多余的前置反斜杠
    l_ovalue             RAW(1000);
    l_decrypted_data     RAW (4000);
    key          RAW(100)  := utl_raw.cast_to_raw('你的16位或24位正确密钥');
    iv           RAW(16)   := utl_raw.cast_to_raw('和加密端一致的IV值'); -- 新增IV变量
BEGIN
    l_ovalue := utl_encode.base64_decode(utl_raw.cast_to_raw(ciphertext));
    -- 调用解密时传入IV参数
    l_decrypted_data := DBMS_CRYPTO.DECRYPT(
        l_ovalue, 
        dbms_crypto.ENCRYPT_3DES + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5, 
        key,
        iv
    );
    dbms_output.put_line('dec STR='||UTL_RAW.CAST_TO_VARCHAR2(l_decrypted_data));
END;
/
  • 如果加密时使用的是ECB模式不需要IV,将算法参数中的dbms_crypto.CHAIN_CBC替换为dbms_crypto.CHAIN_ECB即可,不需要新增IV参数。
  • 清理Base64密文:确认密文没有多余转义字符、编码格式合法,再传入解码逻辑。
  • 如遇权限问题,使用SYS用户执行授权语句:GRANT EXECUTE ON SYS.DBMS_CRYPTO TO 你的操作用户名;

内容的提问来源于stack exchange,提问作者0x6B6F77616C74

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:36:03