Plsql 我正在使用下面的函数解密代码?能帮我解决吗?
ibp_crypto_decrypt=ORA-28817:PL/SQL函数返回了一个错误Plsql 我正在使用下面的函数解密代码?能帮我解决吗?,plsql,plsqldeveloper,mod-plsql,Plsql,Plsqldeveloper,Mod Plsql,ibp_crypto_decrypt=ORA-28817:PL/SQL函数返回了一个错误 function ibp_crypto_decrypt ( p_session_id in RAW) return raw is l_decrypted_raw RAW(2048); l_encrypted_raw RAW(2048) := p_session_id; l_key RAW(128) := UTL_RAW.cast_to_raw('abcdefgh'
function ibp_crypto_decrypt ( p_session_id in RAW) return raw is
l_decrypted_raw RAW(2048);
l_encrypted_raw RAW(2048) := p_session_id;
l_key RAW(128) := UTL_RAW.cast_to_raw('abcdefgh');
begin
dbms_output.put_line('l_encrypted_raw '||'='||l_encrypted_raw);
l_decrypted_raw := DBMS_CRYPTO.decrypt(src => l_encrypted_raw,
typ => DBMS_CRYPTO.des_cbc_pkcs5,
key => l_key);
DBMS_OUTPUT.put_line('Decrypted : ' || UTL_RAW.cast_to_varchar2(l_decrypted_raw)) ;
return l_decrypted_raw;--RAWTOHEX(UTL_RAW.cast_to_varchar2(l_decrypted_raw));
exception when others
then
dbms_output.put_line(' ibp_crypto_decrypt'||'='||sqlerrm||dbms_utility.format_error_backtrace);
end;
我已经用一个实际值的加密完成了您的示例,它按照预期工作。您确定正确加密了该值吗
ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 67
ORA-06512: at "SYS.DBMS_CRYPTO", line 44
ORA-06512: at "IBOXV5_TEST.IBK_CRYPTO_ENCRYPTION", line 28
Oracle支持部门表示:
将加密值传递给解密函数或存储在数据库中时,不要使用UTL_I18N.RAW_to_CHAR,而应使用RAWTOHEX或UTL_ENCODE.BASE64_ENCODE。同样,对于转换回原始数据,不要使用UTL_I18N.STRING_转换为原始数据,而是使用HEXTORAW或UTL_ENCODE.BASE64_DECODE
因此,答案取决于如何创建传递给函数的原始值。
根据我在Oracle 12.2中使用
UTL\u RAW.cast\u to\u RAW
函数的经验,有时也会导致ORA-06512:在解密函数中的“SYS.DBMS\u CRYPTO\u FFI”第67行
。我的回答是否解决了这个问题?如果是,请接受答案并关闭问题或评论。当您使用utl\u raw.cast\u to\u raw
和utl\u raw.cast\u to\u varchar2
时,有时可能会发生上述错误。当您编码类似于12345678
的内容时,就可以了。但是如果您尝试更长的时间,您将在第67行的“SYS.DBMS\u CRYPTO\u FFI”中获得ORA-06512:
DECLARE
l_input VARCHAR2(30) := utl_raw.cast_to_raw('12345678');
l_encrypted_raw RAW(2048);
l_decrypted_raw RAW(2048);
l_key RAW(128) := utl_raw.cast_to_raw('abcdefgh');
BEGIN
l_encrypted_raw := dbms_crypto.encrypt(src=>l_input, typ=>dbms_crypto.des_cbc_pkcs5, key=>l_key);
l_decrypted_raw := dbms_crypto.decrypt(src=>l_encrypted_raw, typ=>dbms_crypto.des_cbc_pkcs5, key=>l_key);
dbms_output.put_line('Decrypted : ' || utl_raw.cast_to_varchar2(l_decrypted_raw));
END;
/