使用DBMS_CRYPTO但与dbms_obfuscation_toolkit一起使用时出错

时间:2019-06-13 07:07:10

标签: java oracle plsql database-administration

捕获到的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; 结束密码;

2 个答案:

答案 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;

enter image description here

ENCRYPT和DECRYPT的不同键:

SELECT
    CIPHER.DECRYPT(CIPHER.ENCRYPT('stackoverflow', UTL_RAW.CAST_TO_RAW('123')), UTL_RAW.CAST_TO_RAW('1234'))
FROM
    DUAL;

enter image description here

答案 1 :(得分:0)

当我使用 UTL_RAW 转换为 RAW 时,有时会遇到相同的错误。这取决于价值。

关于 ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 67 错误 Oracle 支持建议仅使用 RAWTOHEXUTL_ENCODE.BASE64_ENCODE 函数传递值以进行解密或存储。分别为 HEXTORAWUTL_ENCODE.BASE64_DECODE