1

我需要的

  • 我需要解密数据库中存储的密码。

我试过 sql

https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_crypto.htm#i1001225

sql

                DECLARE
                   input_string       VARCHAR2 (200) :=  'Secret Message';
                  encrypted_answer_raw  RAW(2000);             
                   output_string      VARCHAR2 (200);
                   encrypted_raw      RAW (2000);             -- stores encrypted binary text
                   decrypted_raw      RAW (2000);             -- stores decrypted binary text
                   num_key_bytes      NUMBER := 256/8;        -- key length 256 bits (32 bytes)
                   key_bytes_raw      RAW (32);               -- stores 256-bit encryption key
                   encryption_type    PLS_INTEGER :=          -- total encryption type
                                            DBMS_CRYPTO.ENCRYPT_AES256
                                          + DBMS_CRYPTO.CHAIN_CBC
                                          + DBMS_CRYPTO.PAD_PKCS5;
                BEGIN
                   DBMS_OUTPUT.PUT_LINE ( 'Original string: ' || input_string);
                   key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
                   encrypted_raw := DBMS_CRYPTO.ENCRYPT
                      (
                         src => UTL_I18N.STRING_TO_RAW (input_string,  'AL32UTF8'),
                         typ => encryption_type,
                         key => key_bytes_raw
                      );
                    -- The encrypted value "encrypted_raw" can be used here
                    debug_msg('encrypted_raw'||encrypted_raw);

解密代码

代码作品

                  decrypted_raw := DBMS_CRYPTO.DECRYPT
                      (
                         src => encrypted_raw,
                         typ => encryption_type,
                         key => key_bytes_raw
                      );

                   output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');

代码不起作用

                  encrypted_answer_raw:=utl_raw.cast_to_raw('989628CCF16292A73FEB63D4694C8129');
                   decrypted_raw := DBMS_CRYPTO.DECRYPT
                      (
                         src => encrypted_answer_raw,
                         typ => encryption_type,
                         key => key_bytes_raw
                      );

                   output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');

                        DBMS_OUTPUT.PUT_LINE ('Decrypted string: ' || output_string);
                END;

错误

        Error report -
        ORA-28817: PL/SQL function returned an error.
        ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 67
        ORA-06512: at "SYS.DBMS_CRYPTO", line 44
        ORA-06512: at line 25
        28817. 00000 -  "PL/SQL function returned an error."
        *Cause:    A PL/SQL function returned an error unexpectedly.
        *Action:   This is an internal error. Enable tracing to find more
                   information. Contact Oracle customer support if needed.
        *Document: NO

989628CCF16292A73FEB63D4694C8129 是存储在数据库中的数据库加密密码。

  • 任何帮助都是最受欢迎的。
4

1 回答 1

2

我怀疑不是这样做

encrypted_answer_raw := utl_raw.cast_to_raw('989628CCF16292A73FEB63D4694C8129');

你可能想做

encrypted_answer_raw := hextoraw('989628CCF16292A73FEB63D4694C8129');

我认为问题在于密码不是真的989628CCF16292A73FEB63D4694C8129,而是–(Ěńb’§?ëcÔiL)(显示在 win1250 代码页中),尽管您的 Oracle 客户端软件将raw列显示为十六进制字符串。

作为旁注...

您问题下的所有这些评论,说明您应该存储+比较密码哈希而不是加密+解密它们,都是有效的。

于 2019-11-05T22:58:28.010 回答