创建密码验证功能Oracle 10g

时间:2014-10-23 06:16:33

标签: regex oracle oracle10g

如何在ORACLE中创建一个功能来检查密码?

密码应包含:

  • 至少1个大写

  • 至少1个小写

  • 至少1位

  • 至少8个字符

  • 不包含3个连续的用户名字母

到目前为止,我达到了以下目标:

CREATE OR REPLACE FUNCTION dd_pwd_fun(username varchar2, password varchar2)
RETURN BOOLEAN IS

PWD_STR VARCHAR2
USER_NAME

BEGIN

PWD_STR = password;
USER_NAME=username;

IF LENGTH(PWD_STR) < 8 THEN
RETURN FALSE;
END IF;

if regexp_like(:PWD_STR, '^.*[a-z].*$') -- this is for small letter from a -z
and regexp_like(:PWD_STR, '^.*[A-Z].*$') -- this is for capital letters
and regexp_like(:PWD_STR, '^.*[0-9].*$') -- this is for numbers

这是我第一次使用正则表达式,我需要一些帮助来找到最后一个要求的解决方案,而且我想知道我是否在正确的轨道上

3 个答案:

答案 0 :(得分:2)

Oracle提供了一个在SYS下编译的功能,用于密码验证,而且复杂。您可以在$ORACLE_HOME/rdbms/admin/utlpwdmg.sql找到它。

对于不同的版本,该功能已被修改,并添加了新功能。在10g中,复杂性检查非常简单。在12c之前,有两个函数verify_function(10g)和verify_function_11G(11g)。使用12c时,还有四个函数ora12c_verify_functionora12c_strong_verify_function和两个辅助函数complexity_checkstring_distance

由于您使用的是10g,因此您可以编写UDF来强制complexity check password verification。在较新版本中搜索函数及其内容,并在UDF中应用类似的逻辑。看看http://www.oradba.ch/2013/07/oracle-12c-new-password-verify-function/

答案 1 :(得分:1)

我发现这个解决方案正常工作

FOR i IN 1..LENGTH(PWD_STR)-2 LOOP
IF INSTR(LOWER(USER_NAME),SUBSTR(LOWER(PWD_STR),i,3)) > 0 THEN
RETURN FALSE;
END IF;
END LOOP;

答案 2 :(得分:0)

作为一般解决方案,我会推动(也)使用Password Complexity Verification function。关于你的上一个要求:

  
      
  • ...
  •   
  • 不包含3个连续的用户名字母
  •   
     

我需要一些帮助来找到最后一个要求的解决方案[...]

如果表演不是问题,你可以在SQL级别解决这个问题。例如:

SELECT COUNT(*) INTO nbr_matching_chunk FROM (
  -- Split name in 3 chars chunks
  SELECT SUBSTR('Sylvain', LEVEL, 3) chunk
  FROM DUAL CONNECT BY LEVEL <= LENGTH('Sylvain')-2
)
NATURAL JOIN
(
  -- Split password in 3 chars chunks
  SELECT SUBSTR('painsword', LEVEL, 3) chunk
  FROM DUAL CONNECT BY LEVEL <= LENGTH('painsword')-2
)
     

如果nbr_matching_chunk为0,则没有匹配的3个字母序列。

     

或者为了便于阅读我已经对usernamepassword进行了硬编码,但您应该能够用实际的PL / SQL变量替换它。

然后,您只需将其包含在您的个人资料中PASSWORD_VERIFY_FUNCTION