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函数,示例代码调整如下:
- 如果确认加密时使用的是CBC模式,获取加密时使用的IV值,转换为RAW后作为第四个参数传入
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
相关产品推荐
相关产品推荐

