Oracle 无法使用DBMS_CRYPTO.Decrypt解密Varchar2密码

Oracle 无法使用DBMS_CRYPTO.Decrypt解密Varchar2密码,oracle,encryption,oracle12c,dbms-crypto,Oracle,Encryption,Oracle12c,Dbms Crypto,我需要什么 我需要解密数据库中的密码存储 我试过sql sql 解密码 代码工作 decrypted_raw := DBMS_CRYPTO.DECRYPT ( src => encrypted_raw, typ => encryption_type,

我需要什么

  • 我需要解密数据库中的密码存储
我试过sql

sql

解密码

代码工作

                  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;
错误

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

  • 欢迎任何帮助

我怀疑

encrypted_answer_raw := utl_raw.cast_to_raw('989628CCF16292A73FEB63D4694C8129');
你可能想做什么

encrypted_answer_raw := hextoraw('989628CCF16292A73FEB63D4694C8129');
我认为问题在于,尽管您的Oracle客户端软件将原始列显示为六个字符串,但密码并不是真正的
989628CCF16292A73FEB63D4694C8129
,而是
–(Ěb'§?cÔiL)
(显示在win1250代码页中)

作为旁注…


你问题下的所有评论都是有效的,说明你应该存储+比较密码散列,而不是加密+解密它们。

我怀疑不是这样做

encrypted_answer_raw := utl_raw.cast_to_raw('989628CCF16292A73FEB63D4694C8129');
你可能想做什么

encrypted_answer_raw := hextoraw('989628CCF16292A73FEB63D4694C8129');
我认为问题在于,尽管您的Oracle客户端软件将原始列显示为六个字符串,但密码并不是真正的
989628CCF16292A73FEB63D4694C8129
,而是
–(Ěb'§?cÔiL)
(显示在win1250代码页中)

作为旁注…


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

为什么需要解密密码?它不会信任一个应用程序,在这个应用程序中你完全可以做到这一点-所有方式加密用户输入并将其与加密值进行比较应该是你所需要的==db_password而不是从dbu解密密码但是每次加密期间我都会得到新字符串如何验证输入字符串不要使用随机密钥加密而是使用固定密钥,或者使用没有密钥的标准加密方法确定性(每次调用时都会得到定义的结果),因此加密的结果也是随机的——或多或少。(名称
RANDOM…
表示这一点)。生成密钥后,必须将其存储以供进一步使用。但由于这也允许解密,所以最好使用哈希算法,因为解密(很可能)是不可能的。为什么需要解密密码?它不会信任一个应用程序,在这个应用程序中你完全可以做到这一点-所有方式加密用户输入并将其与加密值进行比较应该是你所需要的==db_password而不是从dbu解密密码但是每次加密期间我都会得到新字符串如何验证输入字符串不要使用随机密钥加密而是使用固定密钥,或者使用没有密钥的标准加密方法确定性(每次调用时都会得到定义的结果),因此加密的结果也是随机的——或多或少。(名称
RANDOM…
表示这一点)。生成密钥后,必须将其存储以供进一步使用。但由于这也允许解密,因此最好使用哈希算法,因为解密(很可能)是不可能的。@afeef,我同意@nop77svk,您绝对应该对密码的哈希值进行哈希和比较。使用MAC操作,并为每个密码使用不同的“密钥”,您将有效地为每个密码添加散列,这是此类情况下的标准安全实践。按照已发布的算法,您可以构建一个标准密码哈希协议,但我怀疑您会对
DBMS\u CRYPTO.MAC
操作感到满意。@afeef,我同意@nop77svk,您绝对应该对密码的哈希值进行哈希和比较。使用MAC操作,并为每个密码使用不同的“密钥”,您将有效地为每个密码添加散列,这是此类情况下的标准安全实践。按照已发布的算法,您可以构建一个标准密码哈希协议,但我怀疑您会对
DBMS\u CRYPTO.MAC
操作感到满意。