Oracle帐户口令强度策略限制

来源:互联网 发布:纹理识别算法 编辑:程序博客网 时间:2024/05/29 14:24
发发劳骚,移动的安全扫描TMD郁闷呀,各方面的问题。

1. 用户口令要求包含字母、数据和特殊字符三种类型

(1)创建密码检查函数

CREATE OR REPLACE FUNCTION verify_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) < 4 THEN      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   <<findchar>>   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   <<findpunct>>   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;   <<endsearch>>   -- 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) < 3 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 < 3 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;/


(2)创建密码检查profile及应用于业务用户
CREATE PROFILE profile_pwd LIMIT PASSWORD_VERIFY_FUNCTION verify_function;
ALTER USER NDMC PROFILE profile_pwd; 




2. 用户口令要求数字和字母,不强制要求特殊字符


(1)创建密码检查函数
CREATE OR REPLACE FUNCTION verify_function(username varchar2,  password varchar2,  old_password varchar2)  RETURN boolean IS    n boolean;   m integer;   differ integer;   isdigit boolean;   ischar  boolean;   ispunct boolean;   db_name varchar2(40);   digitarray varchar2(20);   punctarray varchar2(25);   chararray varchar2(52);   i_char varchar2(10);   simple_password varchar2(10);   reverse_user varchar2(32);BEGIN    digitarray:= '0123456789';   chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';   -- Check for the minimum length of the password   IF length(password) < 8 THEN      raise_application_error(-20001, 'Password length less than 8');   END IF;   -- Check if the password is same as the username or username(1-100)   IF NLS_LOWER(password) = NLS_LOWER(username) THEN     raise_application_error(-20002, 'Password same as or similar to user');   END IF;   FOR i IN 1..100 LOOP      i_char := to_char(i);      if NLS_LOWER(username)|| i_char = NLS_LOWER(password) THEN        raise_application_error(-20005, 'Password same as or similar to user name ');      END IF;    END LOOP;   -- Check if the password is same as the username reversed      FOR i in REVERSE 1..length(username) LOOP     reverse_user := reverse_user || substr(username, i, 1);   END LOOP;   IF NLS_LOWER(password) = NLS_LOWER(reverse_user) THEN     raise_application_error(-20003, 'Password same as username reversed');   END IF;   -- Check if the password is the same as server name and or servername(1-100)   select name into db_name from sys.v$database;   if NLS_LOWER(db_name) = NLS_LOWER(password) THEN      raise_application_error(-20004, 'Password same as or similar to server name');   END IF;   FOR i IN 1..100 LOOP      i_char := to_char(i);      if NLS_LOWER(db_name)|| i_char = NLS_LOWER(password) THEN        raise_application_error(-20005, 'Password same as or similar to server name ');      END IF;    END LOOP;   -- 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 ('welcome1', 'database1', 'account1', 'user1234', 'password1', 'oracle123', 'computer1', 'abcdefg1', 'change_on_install') THEN      raise_application_error(-20006, 'Password too simple');   END IF;   -- Check if the password is the same as oracle (1-100)    simple_password := 'oracle';    FOR i IN 1..100 LOOP      i_char := to_char(i);      if simple_password || i_char = NLS_LOWER(password) THEN        raise_application_error(-20007, 'Password too simple ');      END IF;    END LOOP;   -- Check if the password contains at least one letter, one digit    -- 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(-20008, 'Password must contain at least one digit, one character');   END IF;   -- 2. Check for the character   <<findchar>>   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 endsearch;         END IF;      END LOOP;   END LOOP;   IF ischar = FALSE THEN      raise_application_error(-20009, 'Password must contain at least one \              digit, and one character');   END IF;   <<endsearch>>   -- 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);     differ := abs(differ);     IF differ < 3 THEN       IF length(password) < length(old_password) THEN         m := length(password);       ELSE         m := length(old_password);       END IF;       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 < 3 THEN         raise_application_error(-20011, 'Password should differ from the \            old password by at least 3 characters');       END IF;     END IF;   END IF;   -- Everything is fine; return TRUE ;      RETURN(TRUE);END;/


(2)创建密码检查profile及应用于业务用户
CREATE PROFILE profile_pwd LIMIT PASSWORD_VERIFY_FUNCTION verify_function;
ALTER USER NDMC PROFILE profile_pwd; 



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一岁四个月宝宝不理人不说话怎么办 两岁七个月还不会说话怎么办 2岁3个月宝宝说话结巴怎么办 两周的宝宝突然说话结巴怎么办 宝宝3岁半了说话口吃怎么办? 四十天的宝宝吐奶严重怎么办 宝宝吐奶从鼻子喷出来怎么办 六个多月宝宝吐奶一股酸味怎么办 50天的宝宝吃了就吐怎么办 微信语音群聊超过9人怎么办 四个月宝宝母乳不够不喝奶粉怎么办 四个月的宝宝母乳不够吃怎么办 火山直播十多天了还都是假人怎么办 吉利汽车锁了后屁股灯还亮怎么办 六个月凶了他突然不说话了怎么办 微信聊天聊的时间长了没话题怎么办 群聊同学加我微信不想加怎么办? 翡翠销售遇到不说话的客人怎么办 4个月宝宝吃手上瘾怎么办 宝宝吃手上瘾拒绝吃奶粉吃奶怎么办 2岁宝宝特别粘人爱哭怎么办 3岁半宝宝突然说话口吃怎么办 2岁3个月宝宝突然说话结巴怎么办 一位特爱说话爱玩的高中生怎么办 猫5天不吃不喝躲起来该怎么办 两个月的小家猫睡觉要黏人睡怎么办 成年的儿子不听话做父母要怎么办 听到孩子上课又不听话想揍他怎么办 18个月小孩脾气很犟怎么办 烦自己的孩子想弄死他怎么办 楼道经常有小孩在门口恶作剧怎么办 2岁宝宝咳嗽咳吐了怎么办 不小心把鱼刺吃下去该怎么办 儿子在学校被老师甩耳光我该怎么办 家长诬陷老师打她家孩子耳光怎么办 一岁宝宝总觉得有痰怎么办 一岁宝宝感冒咳嗽有痰怎么办 哭的时候踹不过气来应该怎么办 孩子在幼儿园被老师罚站怎么办 孩子屁股打肿了又红又紫怎么办 生完孩子两个月一直浑身疼怎么办