【问题标题】:Retrieving password from an oracle package从 oracle 包中检索密码
【发布时间】:2019-11-27 03:41:36
【问题描述】:

我有以下代码,我的问题是如何确定l_key 中的加密密钥没有被更改?

create or replace PACKAGE BODY                                  "ENCRYPT_DECRYPT_PASSWORD"
AS

  l_key RAW(128) := utl_raw.cast_to_raw('secret');

  ------------------------------------------------------------------------
  FUNCTION encrypt_val( p_val IN VARCHAR2 ) RETURN VARCHAR2
  IS
    l_encrypted RAW(2048);
      l_val  RAW(2048) := utl_raw.cast_to_raw(p_val);

  BEGIN

  l_encrypted := dbms_crypto.encrypt
                   ( src => l_val,
                     typ => dbms_crypto.des_cbc_pkcs5,
                     key => l_key );

  return utl_raw.cast_to_varchar2(l_encrypted);

  END encrypt_val;

-----------------
-----------------
-----------------

 FUNCTION decrypt_val( p_val IN varchar2 ) RETURN VARCHAR2
  IS
    l_decrypted RAW(2048);
    l_val RAW(2048) := utl_raw.cast_to_raw(p_val);
   BEGIN
         l_decrypted := dbms_crypto.decrypt
                ( src =>  l_val,
                  typ => dbms_crypto.des_cbc_pkcs5,
                  key => l_key );

         return utl_raw.cast_to_varchar2(l_decrypted);

  END decrypt_val;
-----------------
-----------------
-----------------
PROCEDURE encrypt_table_passwords(table_name  IN varchar2,
                                 column_name IN varchar2,
                                 table_id    IN varchar2) IS
BEGIN
  EXECUTE IMMEDIATE
  'begin
  for c1 in (select * from ' || table_name ||') loop
  update ' || table_name || ' set ' || column_name || ' = ENCRYPT_DECRYPT_PASSWORD.encrypt_val(c1.' || column_name || ') where ' || table_id || ' = c1.'||table_id||' and ' || column_name ||
                    ' is not null; end loop; end;';
END encrypt_table_passwords;
-----------------
-----------------
-----------------

FUNCTION get_decrypted_password( table_name IN varchar2,column_name IN varchar2,table_id IN varchar2,table_id_val IN varchar2 ) RETURN VARCHAR2
  IS
     encrypted_pas varchar2(100);
     decrypted_pas varchar2(100);

   BEGIN
      EXECUTE IMMEDIATE 'select ' || column_name || ' from ' || table_name || ' where ' || table_id || ' = ' || table_id_val
         INTO encrypted_pas;
         Select decrypt_val(encrypted_pas) into decrypted_pas from dual;
        --return decrypt_val(encrypted_pas);
        return decrypted_pas;
  END get_decrypted_password;

END encrypt_decrypt_password;

我尝试了以下在网上找到的方法,但它似乎不适用于我的 oracle 版本:

DECLARE
    v_x   RAW(128);
BEGIN
    SELECT ENCRYPT_DECRYPT_PASSWORD.l_key x
    INTO v_x
    FROM DUAL;
    DBMS_OUTPUT.put_line (v_x);
END;
/

我得到“必须声明组件'L_KEY'”和“无效标识符”。

我想调查的原因是,在我将密码列从 varchar(99) 更改为 nvarchar2(100) 并重新生成加密密码后,解密错误消失了。

【问题讨论】:

    标签: oracle variables encryption package


    【解决方案1】:

    我得到“必须声明组件'L_KEY'”和“无效标识符”。

    L_KEY 在你的包 BODY 中声明。这意味着它的范围是私有的,仅限于正文的代码。只有在包 SPEC 中声明的东西是公开的,并且可以在包范围之外访问。

    如果你需要检查它的实际值,你需要使用一个返回 L_KEY 的函数来扩展你的包。您可能不想在生产中公开它,所以要小心。您不妨考虑使用conditional compilation,以确保不会意外泄漏。

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2021-02-02
      • 2012-02-12
      • 2013-09-20
      • 2015-01-28
      相关资源
      最近更新 更多