【问题标题】:Create Password Verification Function Oracle 10g创建密码验证功能 Oracle 10g
【发布时间】:2014-12-18 18:39:09
【问题描述】:

如何在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 中实施密码复杂性”方面的帮助?
  • 为了强制执行密码,我所需要的不就是将验证功能添加到所需的配置文件吗?在创建此函数时,我需要正则表达式或常规 PL/SQL 方面的帮助。
  • @NicholasKrasnov 有什么想法或帮助吗?
  • 写UDF不用花太多力气,Oracle提供了这样的功能。检查我的答案。

标签: regex oracle oracle10g


【解决方案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;

【讨论】:

  • 不应该是LENGTH(PWD) - 2吗?
  • 最后两次迭代不是必需的。
【解决方案2】:

作为一般解决方案,我会(也)推动使用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 中。

【讨论】:

    【解决方案3】:

    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 以在 password verification 中强制执行更强的 complexity check。在较新版本中搜索函数及其内容,并在您的 UDF 中应用类似的逻辑。看看http://www.oradba.ch/2013/07/oracle-12c-new-password-verify-function/

    【讨论】:

    • 感谢您的提示,但该文件不包含任何有关连续字母的示例
    • 是的,您需要编写自己的逻辑。并将其添加到 UDF。如果您无法为其编写逻辑,请告诉我。
    • 我不能,我正在尝试使用正则表达式,但我无法到达那里......我不介意任何方式,无论是使用正则表达式还是 PL/SQL命令
    • 由于密码不能超过 8 个字符,所以 substr 函数可以有 6 种组合。 1 到 3、2 到 4 .....最后是 6 到 8。
    • 密码至少8个字符
    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多