ITPub博客

首页 > Linux操作系统 > Linux操作系统 > pl/sql 口令校验

pl/sql 口令校验

原创 Linux操作系统 作者:bjiokn 时间:2009-12-16 15:17:43 0 删除 编辑

CREATE OR REPLACE FUNCTION prefile_function
(username varchar2,
  password varchar2,
  old_password varchar2)
  RETURN boolean IS
   n boolean;
   m integer;
   differ integer;
   isdigit boolean;
   ischar  boolean;
   ispunct boolean;
   digitarray varchar2(20);
   punctarray varchar2(25);
   chararray varchar2(52);

BEGIN
   digitarray:= '0123456789';
   chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
   punctarray:='!"#$%&()``*+,-/:;<=>?_';

   -- Check if the password is same as the username
   IF NLS_LOWER(password) = NLS_LOWER(username) THEN
     raise_application_error(-20001, 'Password same as or similar to user');
   END IF;

   -- Check for the minimum length of the password
   IF length(password) < 6 THEN  --长度不小于6个字符
      raise_application_error(-20002, 'Password length less than 4');
   END IF;

   -- Check if the password is too simple. A dictionary of words may be
   -- maintained and a check may be made so as not to allow the words
   -- that are too simple for the password.
   IF NLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password',

'oracle', 'computer', 'abcd') THEN
      raise_application_error(-20002, 'Password too simple');
   END IF;

   -- Check if the password contains at least one letter, one digit and one
   -- punctuation mark.
   -- 1. Check for the digit
   isdigit:=FALSE;
   m := length(password);
   FOR i IN 1..10 LOOP
      FOR j IN 1..m LOOP
         IF substr(password,j,1) = substr(digitarray,i,1) THEN
            isdigit:=TRUE;
             GOTO findchar;
         END IF;
      END LOOP;
   END LOOP;
   IF isdigit = FALSE THEN
      raise_application_error(-20003, 'Password should contain at least one digit,

one character and one punctuation');
   END IF;
   -- 2. Check for the character
   <>
   ischar:=FALSE;
   FOR i IN 1..length(chararray) LOOP
      FOR j IN 1..m LOOP
         IF substr(password,j,1) = substr(chararray,i,1) THEN
            ischar:=TRUE;
             GOTO findpunct;
         END IF;
      END LOOP;
   END LOOP;
   IF ischar = FALSE THEN
      raise_application_error(-20003, 'Password should contain at least one \
              digit, one character and one punctuation');
   END IF;
   -- 3. Check for the punctuation
   <>
   ispunct:=FALSE;
   FOR i IN 1..length(punctarray) LOOP
      FOR j IN 1..m LOOP
         IF substr(password,j,1) = substr(punctarray,i,1) THEN
            ispunct:=TRUE;
             GOTO endsearch;
         END IF;
      END LOOP;
   END LOOP;
   IF ispunct = FALSE THEN
      raise_application_error(-20003, 'Password should contain at least one \
              digit, one character and one punctuation');
   END IF;

   <>
   -- Check if the password differs from the previous password by at least
   -- 3 letters
   IF old_password IS NOT NULL THEN
     differ := length(old_password) - length(password);

     IF abs(differ) < 5 THEN
       IF length(password) < length(old_password) THEN
         m := length(password);
       ELSE
         m := length(old_password);
       END IF;

       differ := abs(differ);
       FOR i IN 1..m LOOP
         IF substr(password,i,1) != substr(old_password,i,1) THEN
           differ := differ + 1;
         END IF;
       END LOOP;

       IF differ < 5 THEN
         raise_application_error(-20004, 'Password should differ by at \
         least 3 characters');
       END IF;
     END IF;
   END IF;
   -- Everything is fine; return TRUE ;  
   RETURN(TRUE);
END;
/


ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 5  --口令在失效前的生存期,单位是天
PASSWORD_GRACE_TIME 1/24 --口令失效后从第一次成功登录算起的更改口令的宽限期,单位是天
PASSWORD_REUSE_TIME 5  --可以重新使用口令前的天数
PASSWORD_REUSE_MAX 5  --可以重新使用口令的最多次数
FAILED_LOGIN_ATTEMPTS 3  --锁定账号前登陆失败的次数
PASSWORD_LOCK_TIME 1/24  --达到指定的登录次数后,要锁定账号的天数
PASSWORD_VERIFY_FUNCTION prefile_function; --口令校验名称

--------------------------------------------------------------------------------------------

1小时:password_lock_time=1/24

10分钟:password_lock_time=10/1400

5分钟: password_lock_time=5/1400

=============================

删除配置文件:口令设置

drop profile profile_name cascade;

 

 

 

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21021875/viewspace-622571/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: UltraISO_v9.35
请登录后发表评论 登录
全部评论

注册时间:2009-05-31

  • 博文量
    94
  • 访问量
    113661