Regex 创建密码验证功能Oracle 10g

Regex 创建密码验证功能Oracle 10g,regex,oracle,oracle10g,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=us

如何在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

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

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

在不同的版本中,该函数已被修改,并添加了新函数。在10g中,复杂性检查非常简单。在12c之前,有两个功能验证功能10g和验证功能11G。使用12c,还有四个函数,ora12c_verify_函数、ora12c_strong_verify_函数和两个助手函数complexity_check和string_distance


因为您使用的是10g,所以您可以编写UDF来强制执行更复杂的密码验证检查。在更新版本中搜索函数及其内容,并在UDF中应用类似的逻辑。看看

作为一个通用解决方案,我也会推动使用。关于你最后的要求:

... 不包含用户名的3个连续字母 我需要一些帮助来找出最后一个需求的解决方案[…]

如果性能不是问题,您可能可以在SQL级别解决这个问题。例如:

如果nbr_matching_chunk为0,则不存在匹配的3字母序列

当然,为了可读性,我已经硬编码了用户名和密码,但您应该能够用实际的PL/SQL变量替换它们


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

我发现这个解决方案很有效

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;

因此,您需要正则表达式方面的帮助,或者需要如何在Oracle中强制执行密码复杂性方面的帮助?对于强制执行密码,我所需要的不是将验证功能添加到所需的配置文件中吗?在创建此函数时,我需要正则表达式或正则PL/SQL的帮助。@NicholasKrasnov有什么想法或帮助吗?您不必花太多精力来编写UDF,Oracle提供了这样的函数。检查我的答案。谢谢你的提示,但该文件不包含任何关于连续字母的示例,只是为了这个,你需要编写自己的逻辑。并将其添加到UDF中。如果您不能为它编写逻辑,请告诉我。我不能,我正在尝试使用正则表达式,但我无法实现。。。我不介意任何方式,无论是使用正则表达式还是PL/SQL命令,只要密码不能超过8个字符,就可以有6个substr函数组合。1到3,2到4…最后是6到8。密码应该至少是8个字符,不是长度pwd-2吗?最后两次迭代不需要。
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;