1、Oracle 密码复杂度的设置Oracle 密码复杂度的设置-某些情况下,需要强制Oracle数据库中的某些用户(例如sys,system,或者其他)的密码,不能太简单。-虽然作为数据库管理人员,不会设置太简单的密码。但是,当需要数据库级别,不允许设置太简单的密码,如果设置太简单的密码,则拒绝本次操作。首先:先查询一下.当前数据库中,都有哪些profileSELECTDISTINCTprofileFROMdba_profiles;一般情况下,所有的用户,是使用一个名字叫DEFAULT的profile下面这个语句,查询DEFAULT的profile,密码方面的设置。SQLselect2RESOU
2、RCE_NAME,3LIMIT4from5dba_profiles6where7profile=DEFAULT8ANDRESOURCE_TYPE=PASSWORD;RESOURCE_NAMELIMIT-FAILED_LOGIN_ATTEMPTSUNLIMITEDPASSWORD_LIFE_TIMEUNLIMITEDPASSWORD_REUSE_TIMEUNLIMITEDPASSWORD_REUSE_MAXUNLIMITEDPASSWORD_VERIFY_FUNCTIONNULLPASSWORD_LOCK_TIMEUNLIMITEDPASSWORD_GRACE_TIMEUNLIMITED已选择7
3、行。注意到,那个PASSWORD_VERIFY_FUNCTION的LIMIT是NULL也就是没有任何的密码复杂度限制。由于听说,直接执行那个utlpwdmg.sql,会修改DEFAULT这个PROFILE,从而导致影响所有的用户。因此只好去找个那个verify_function的代码,手工做点修改处理。原有的代码是数字+大小写+符号。长度要大于等于4现在修改为仅仅数字+大小写,长度要大于等于10。-验证密码复杂度-参数:-username用户名-password密码-old_password旧密码-返回值:验证是否通过.-CREATEORREPLACEFUNCTIONverify_functi
4、on(usernamevarchar2,passwordvarchar2,old_passwordvarchar2)RETURNbooleanISnboolean;-用于暂存密码长度.minteger;differinteger;-是否包含数字判断标志.isdigitboolean;-是否包含小写字母判断标志.ischar_lowerboolean;-是否包含大写字母判断标志.ischar_upperboolean;-数字字符.digitarrayvarchar2(20);-小写字母字符.chararray_lowervarchar2(26);-大写字母字符.chararray_upperva
5、rchar2(26);BEGIN-数字字符.digitarray:=0123456789;-小写字符.chararray_lower:=abcdefghijklmnopqrstuvwxyz;-大写字符chararray_upper:=ABCDEFGHIJKLMNOPQRSTUVWXYZ;-检查是否用户名与密码是否相同IFNLS_LOWER(password)=NLS_LOWER(username)THENraise_application_error(-20001,Passwordsameasorsimilartouser);ENDIF;-检查密码的长度是否符合要求.IFlength(pass
6、word)10THENraise_application_error(-20002,Passwordlengthlessthan10);ENDIF;-检查密码是否是简单的单词-(这一段理论上执行不到,因为前面加了密码长度大于10的限制)IFNLS_LOWER(password)IN(welcome,database,account,user,password,oracle,computer,abcd)THENraise_application_error(-20002,Passwordtoosimple);ENDIF;-检查密码是否至少包含一个数字、一个小写字母,一个大写字母.-1.检查数字-
7、默认密码中没有数字.isdigit:=FALSE;-取得密码长度.m:=length(password);-从0-9循环FORiIN1.10LOOP-遍历密码中的每一个字符.FORjIN1.mLOOPIFsubstr(password,j,1)=substr(digitarray,i,1)THEN-如果存在数字字符,设置“密码中有数字”isdigit:=TRUE;-跳出循环,进入到检查小写字符的部分.GOTOfindchar_lower;ENDIF;ENDLOOP;ENDLOOP;IFisdigit=FALSETHENraise_application_error(-20003,Passwor
8、dshouldcontainatleastonedigit,oneUppercharacterandoneLowercharacter);ENDIF;-2.检查小写字符.-默认密码中没有小写字符.ischar_lower:=FALSE;-从a-z循环.FORiIN1.length(chararray_lower)LOOP-遍历密码中的每一个字符.FORjIN1.mLOOPIFsubstr(password,j,1)=substr(chararray_lower,i,1)THEN-如果存在小写字母字符,设置“密码中有小写字母”ischar_lower:=TRUE;-跳出循环,进入到检查大写字符的
9、部分.GOTOfindchar_upper;ENDIF;ENDLOOP;ENDLOOP;IFischar_lower=FALSETHENraise_application_error(-20003,Passwordshouldcontainatleastonedigit,oneUppercharacterandoneLowercharacter);ENDIF;-3.检查大写字符.-默认密码中没有大写字符.ischar_upper:=FALSE;-从A-Z循环.FORiIN1.length(chararray_upper)LOOPFORjIN1.mLOOPIFsubstr(password,j,
10、1)=substr(chararray_upper,i,1)THEN-如果存在大写字母字符,设置“密码中有大写字母”ischar_upper:=TRUE;-跳出循环,本次新密码已经包含了数字大写字母与小写字母.GOTOendsearch;ENDIF;ENDLOOP;ENDLOOP;IFischar_upper=FALSETHENraise_application_error(-20003,Passwordshouldcontainatleastonedigit,oneUppercharacterandoneLowercharacter);ENDIF;-检查新密码与旧密码,是否至少有3个字母的变
11、更.IFold_passwordISNOTNULLTHEN-首先获取密码长度的差异.differ:=length(old_password)-length(password);-如果密码长度的差异小于3,那么需要进一步判断了.IFabs(differ)3THEN-设置m=长度比较小的那个密码的长度.IFlength(password)length(old_password)THENm:=length(password);ELSEm:=length(old_password);ENDIF;differ:=abs(differ);-新旧密码字符比较.FORiIN1.mLOOPIFsubstr(pa
12、ssword,i,1)!=substr(old_password,i,1)THENdiffer:=differ+1;ENDIF;ENDLOOP;IFdifferalterusertest_useridentifiedby123;alterusertest_useridentifiedby123*第1行出现错误:ORA-28003:指定口令的口令验证失败ORA-20002:Passwordlengthlessthan10SQLalterusertest_useridentifiedby1234567890;alterusertest_useridentifiedby1234567890*第1行出
13、现错误:ORA-28003:指定口令的口令验证失败ORA-20003:Passwordshouldcontainatleastonedigit,oneUppercharacterandoneLowercharacterSQLalterusertest_useridentifiedby1234567890A;alterusertest_useridentifiedby1234567890A*第1行出现错误:ORA-28003:指定口令的口令验证失败ORA-20003:Passwordshouldcontainatleastonedigit,oneUppercharacterandoneLowercharacterSQLalterusertest_useridentifiedby1234567890Aa;用户已更改。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1