如何在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
这是我第一次使用正则表达式,我需要一些帮助来找到最后一个要求的解决方案,而且我想知道我是否在正确的轨道上
答案 0 :(得分:2)
Oracle提供了一个在SYS下编译的功能,用于密码验证,而且复杂。您可以在$ORACLE_HOME/rdbms/admin/utlpwdmg.sql
找到它。
对于不同的版本,该功能已被修改,并添加了新功能。在10g中,复杂性检查非常简单。在12c之前,有两个函数verify_function
(10g)和verify_function_11G
(11g)。使用12c时,还有四个函数ora12c_verify_function
,ora12c_strong_verify_function
和两个辅助函数complexity_check
和string_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个字母序列。或者为了便于阅读我已经对
username
和password
进行了硬编码,但您应该能够用实际的PL / SQL变量替换它。
然后,您只需将其包含在您的个人资料中PASSWORD_VERIFY_FUNCTION
。