密码不能包含oracle数据库中的用户名或用户全名的一部分(pl/sq)

Posted

技术标签:

【中文标题】密码不能包含oracle数据库中的用户名或用户全名的一部分(pl/sq)【英文标题】:Passwords can’t contain the user name or parts of the user’s full name in oracle database(pl/sq) 【发布时间】:2019-06-28 12:43:02 【问题描述】:

实际上,我有一个小问题是我正在开发应用程序,其中注册用户的表单和验证结束密码不能包含用户名,并且不能包含连续的 2 个字母形式的用户名。 客户要求是通过存储过程来做到这一点。 例如,“zia123”不是用户“Zia”的合适密码

有人知道这个 PL?SQL 存储过程函数吗?

【问题讨论】:

@B001ᛦ 也许 OP 是一家大公司 IT 部门的承包商,在这种情况下,OP 肯定应该从他们的客户那里获取技术要求。如果您认为这是xy problem,请改为说明。 “两个连续的字母”要求感觉最好使用 2-gram (n-gram) 比较来解决。不过,Oracle 中没有内置函数,所以你必须自己动手。此外,在程序而不是应用程序中执行此操作确实感觉很奇怪,因为无论语言如何,都肯定会支持此类功能。 所以像YoM4QG./SsJE3<n&pzihpjW(Sbm<-3xaNKExc2gc,&u&@J<,+&FtVS*u8vvUF 这样的密码你不会认为是合适的(因为它包含zi)?如果用户的用户名很长,你会让你的用户非常讨厌。 【参考方案1】:

您可以尝试查看提供的 Oracle 密码验证功能,以帮助编写此类事情 - 12c 上的 ora12c_verify_functionora12c_strong_verify_function。我在这里包含了一个old_password 参数,因为密码验证的一个常见要求是将新密码与旧密码进行比较。

CREATE OR REPLACE function verify_password_complexity
    (username varchar2,
     password varchar2,
     old_password varchar2)
return varchar2 IS
begin

   -- password must not contain user's name. 
   -- They didn't specify but I'm assuming their requirements want a case-insensitive check.
   if (upper(password) like '%' || upper(username) || '%') then
      return 'password contains username';
   end if;

   -- must not contains consecutive 2 letters from user's name
   for u in (select substr(username,level,2) as pair -- get all pairs of letters
                from dual
                connect by level <= length(username)-1)
   loop
      -- does password contain this pair
      if (upper(password) like '%' || upper(u.pair) || '%') then
        return 'password contains 2 consecutive letters from username: ' || u.pair;
      end if;
   end loop;

   return 'password OK';

end;
/

测试:

begin
  dbms_output.put_line(verify_password_complexity('testuser', 'lkajsdofiuwe', 'oiuwlkajsdf'));
  dbms_output.put_line(verify_password_complexity('testuser', 'lkajsdofiuwer', 'oiuwlkajsdf'));
  dbms_output.put_line(verify_password_complexity('testuser', 'lkatestuseruwe', 'oiuwlkajsdf'));
end;
/

password OK
password contains 2 consecutive letters from username: er
password contains username

【讨论】:

非常感谢您解决我的问题。【参考方案2】:

例如一个函数:

SQL> create or replace function f_unpw (par_username in varchar2, par_password in varchar2)
  2    return varchar2
  3  is
  4    l_username varchar2(30)  := upper(par_username);
  5    l_password varchar2(30)  := upper(par_password);
  6    retval     varchar2(200) := 'Password is OK';
  7  begin
  8    if instr(l_password, l_username) > 0 or
  9       regexp_like(l_password, '[[:alpha:]]2,')
 10    then
 11       retval := 'Password contains username or two (or more) consecutive letters';
 12    end if;
 13
 14    return retval;
 15  end;
 16  /

Function created.

测试:

SQL> with test (un, pw) as
  2    (select 'zIA' , 'zia123' from dual union all
  3     select 'LF'  , 'x123bh' from dual union all
  4     select 'Test', '334d'   from dual
  5    )
  6  select un,
  7         pw,
  8         f_unpw(un, pw) result
  9  from test;

UN   PW     RESULT
---- ------ ----------------------------------------------------------------------
zIA  zia123 Password contains username or two (or more) consecutive letters
LF   x123bh Password contains username or two (or more) consecutive letters
Test 334d   Password is OK

SQL>

随意增强它。

【讨论】:

你的回答很好,真的对我很有帮助,但它没有收到更多的字符(字母)

以上是关于密码不能包含oracle数据库中的用户名或用户全名的一部分(pl/sq)的主要内容,如果未能解决你的问题,请参考以下文章

忘记oracle的sys用户密码怎么修改

oracle-密码

oracle密码相关

Oracle 10g中默认的用户和密码是啥?我在安装数据库时忘记了密码改成啥了,如何才能登陆呢?

ORACLE 用户的 密码 支持哪些特殊字符,不支持哪些字符?

创建oracle数据库时老是提醒我口令缺失或无效