首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DBMS_CRYPTO但使用dbms_obfuscation_toolkit时出错

使用DBMS_CRYPTO但使用dbms_obfuscation_toolkit时出错
EN

Stack Overflow用户
提问于 2019-06-13 15:07:10
回答 2查看 942关注 0票数 0

捕获到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行

开发的代码

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

发布于 2019-06-13 16:35:17

我试过你的代码,结果是肯定的。

当我对加密和解密使用不同的密钥时抛出错误。

如下例所示:

用于加密和解密的相同密钥:

代码语言:javascript
复制
SELECT
    CIPHER.DECRYPT(CIPHER.ENCRYPT('stackoverflow', UTL_RAW.CAST_TO_RAW('123')), UTL_RAW.CAST_TO_RAW('123'))
FROM
    DUAL;

用于加密和解密的不同密钥:

代码语言:javascript
复制
SELECT
    CIPHER.DECRYPT(CIPHER.ENCRYPT('stackoverflow', UTL_RAW.CAST_TO_RAW('123')), UTL_RAW.CAST_TO_RAW('1234'))
FROM
    DUAL;

票数 0
EN

Stack Overflow用户

发布于 2021-03-05 14:35:24

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

对于ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 67-error,Oracle支持建议仅使用RAWTOHEXUTL_ENCODE.BASE64_ENCODE函数来传递用于解密或存储的值。和分别为HEXTORAWUTL_ENCODE.BASE64_DECODE

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56575073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档