繁体   English   中英

使用 DBMS_CRYPTO 但使用 dbms_obfuscation_toolkit 时出错

[英]Error while using DBMS_CRYPTO but working with dbms_obfuscation_toolkit

捕获的 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;
 

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

当我对 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;

在此处输入图片说明

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM