捕获到的SQLException :: Java.sql.SQLException:ORA-29532:Java调用因未捕获的Java异常而终止:java.sql.SQLException:无法获取服务器访问帐户详细信息:ORA-28817:PL / SQL函数返回了错误。
ORA-06512:位于“ SYS.DBMS_CRYPTO_FFI”的第67行
ORA-06512:位于“ SYS.DBMS_CRYPTO”的第44行
ORA-06512:位于“ NM.CIPHER”第41行
ORA-06512:位于“ NM.DEVICE_ACCOUNT”的第176行
ORA-06512:在第1行
ORA-06512:位于“ NM.DEVICE_PROCEDURES”的第8行
ORA-06512:在第1行
创建或替换PACKAGE BODY CIPHER IS seven_bytes RAW(7):= HEXTORAW('00000000000000');
函数make_8_bytes(p_string IN RAW)返回原始IS v_length PLS_INTEGER:= MOD(utl_raw.length(p_string),8); 开始 如果v_length = 0然后 返回p_string; 其他 返回utl_raw.concat(p_string,utl_raw.substr(seven_bytes,1,8-v_length)); 万一; END;
功能加密(p_string IN VARCHAR2, p_key IN RAW)返回原始图像 crypto_raw RAW(2048); l_mod号:= dbms_crypto.ENCRYPT_DES + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5;
开始 --dbms_obfuscation_toolkit.DESEncrypt(输入=> make_8_bytes(utl_raw.cast_to_raw(p_string)),密钥=> make_8_bytes(p_key),加密数据=>加密_raw); 加密原始:= dbms_crypto.encrypt(src => make_8_bytes(utl_raw.cast_to_raw(p_string)),typ => l_mod,key => make_8_bytes(p_key));
RETURN encrypted_raw;
EXCEPTION
WHEN OTHERS THEN
v_errm:=SUBSTR(SQLERRM,1,200);
END;
功能解密(p_string IN RAW, p_key RAW)返回VARCHAR2 IS Deleted_raw RAW(2048); l_ret varchar2(2000); l_mod号:= dbms_crypto.ENCRYPT_DES + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5;
开始 -dbms_obfuscation_toolkit.DESDecrypt(input => p_string,key => make_8_bytes(p_key),decrypted_data => unlocked_raw); Decrypted_raw:= dbms_crypto.Decrypt(src => p_string,typ => l_mod,key => make_8_bytes(p_key)); l_ret:= UTL_I18N.RAW_TO_CHAR(decrypted_raw,'AL32UTF8'); 返回l_ret; -返回rtrim(utl_raw.cast_to_varchar2(decrypted_raw),chr(0));
EXCEPTION
WHEN OTHERS THEN
v_errm:=SUBSTR(SQLERRM,1,200);
END; 结束密码;
答案 0 :(得分:0)
我尝试了您的代码,结果是肯定的。
当我对ENCRYPT和DECRYPT使用不同的密钥时,会引发错误。
请参见以下示例:
与ENCRYPT和DECRYPT相同的密钥:
SELECT
CIPHER.DECRYPT(CIPHER.ENCRYPT('stackoverflow', UTL_RAW.CAST_TO_RAW('123')), UTL_RAW.CAST_TO_RAW('123'))
FROM
DUAL;
ENCRYPT和DECRYPT的不同键:
SELECT
CIPHER.DECRYPT(CIPHER.ENCRYPT('stackoverflow', UTL_RAW.CAST_TO_RAW('123')), UTL_RAW.CAST_TO_RAW('1234'))
FROM
DUAL;
答案 1 :(得分:0)
当我使用 UTL_RAW
转换为 RAW 时,有时会遇到相同的错误。这取决于价值。
关于 ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 67
错误 Oracle 支持建议仅使用 RAWTOHEX
或 UTL_ENCODE.BASE64_ENCODE
函数传递值以进行解密或存储。分别为 HEXTORAW
或 UTL_ENCODE.BASE64_DECODE
。