捕获到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行
开发的代码
create or replace PACKAGE BODY CIPHER IS
seven_bytes RAW(7) := HEXTORAW ('00000000000000');
FUNCTION make_8_bytes ( p_string IN RAW ) RETURN RAW IS
v_length PLS_INTEGER := MOD(utl_raw.length (p_string),8);
BEGIN
IF v_length = 0 THEN
RETURN p_string;
ELSE
RETURN utl_raw.concat (p_string,utl_raw.substr(seven_bytes,1,8-v_length));
END IF;
END;
FUNCTION encrypt ( p_string IN VARCHAR2,
p_key IN RAW ) RETURN RAW IS
encrypted_raw RAW(2048);
l_mod number := dbms_crypto.ENCRYPT_DES
+ dbms_crypto.CHAIN_CBC
+ dbms_crypto.PAD_PKCS5;
BEGIN
--dbms_obfuscation_toolkit.DESEncrypt(input => make_8_bytes (utl_raw.cast_to_raw(p_string)),key => make_8_bytes (p_key), encrypted_data => encrypted_raw );
encrypted_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;
FUNCTION decrypt ( p_string IN RAW,
p_key IN RAW ) RETURN VARCHAR2 IS
decrypted_raw RAW(2048);
l_ret varchar2 (2000);
l_mod number := dbms_crypto.ENCRYPT_DES
+ dbms_crypto.CHAIN_CBC
+ dbms_crypto.PAD_PKCS5;
BEGIN
-- dbms_obfuscation_toolkit.DESDecrypt(input => p_string,key => make_8_bytes (p_key), decrypted_data => decrypted_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');
RETURN l_ret;
--RETURN rtrim(utl_raw.cast_to_varchar2(decrypted_raw),chr(0));
EXCEPTION
WHEN OTHERS THEN
v_errm:=SUBSTR(SQLERRM,1,200);
END;
END CIPHER;发布于 2019-06-13 16:35:17
我试过你的代码,结果是肯定的。
当我对加密和解密使用不同的密钥时抛出错误。
如下例所示:
用于加密和解密的相同密钥:
SELECT
CIPHER.DECRYPT(CIPHER.ENCRYPT('stackoverflow', UTL_RAW.CAST_TO_RAW('123')), UTL_RAW.CAST_TO_RAW('123'))
FROM
DUAL;

用于加密和解密的不同密钥:
SELECT
CIPHER.DECRYPT(CIPHER.ENCRYPT('stackoverflow', UTL_RAW.CAST_TO_RAW('123')), UTL_RAW.CAST_TO_RAW('1234'))
FROM
DUAL;

发布于 2021-03-05 14:35:24
当我使用UTL_RAW进行RAW转换时,我有时会得到相同的错误。这取决于价值。
对于ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 67-error,Oracle支持建议仅使用RAWTOHEX或UTL_ENCODE.BASE64_ENCODE函数来传递用于解密或存储的值。和分别为HEXTORAW或UTL_ENCODE.BASE64_DECODE。
https://stackoverflow.com/questions/56575073
复制相似问题