Oracle 密码复杂度的设置Word文件下载.docx
《Oracle 密码复杂度的设置Word文件下载.docx》由会员分享,可在线阅读,更多相关《Oracle 密码复杂度的设置Word文件下载.docx(8页珍藏版)》请在冰点文库上搜索。
LIMIT
4
from
5
dba_profiles
6
where
7
profile='
DEFAULT'
8
AND
RESOURCE_TYPE
=
'
PASSWORD'
;
RESOURCE_NAME
--------------------------------
------------
FAILED_LOGIN_ATTEMPTS
UNLIMITED
PASSWORD_LIFE_TIME
PASSWORD_REUSE_TIME
PASSWORD_REUSE_MAX
PASSWORD_VERIFY_FUNCTION
NULL
PASSWORD_LOCK_TIME
PASSWORD_GRACE_TIME
已选择7行。
注意到,那个
LIMIT
是
也就是没有任何的密码复杂度限制。
由于听说,直接执行那个
utlpwdmg.sql,
会修改
这个
PROFILE,
从而导致影响所有的用户。
因此只好去找个那个
verify_function
的代码,手工做点修改处理。
原有的代码是
数字
+
大小写
符号。
长度要大于等于4
现在修改为仅仅
大小写,长度要大于等于10。
--------------------------------------------------
--
验证密码复杂度
参数:
username
用户名
password
密码
old_password
旧密码
返回值:
验证是否通过.
CREATE
OR
REPLACE
FUNCTION
verify_function(
varchar2,
varchar2
)
RETURN
boolean
IS
n
boolean;
用于暂存密码长度.
m
integer;
differ
是否包含
判断标志.
isdigit
是否包含小写字母
ischar_lower
是否包含大写字母
ischar_upper
数字字符.
digitarray
varchar2(20);
小写字母字符.
chararray_lower
varchar2(26);
大写字母字符.
chararray_upper
BEGIN
digitarray:
0123456789'
小写字符.
chararray_lower:
abcdefghijklmnopqrstuvwxyz'
大写字符
chararray_upper:
='
ABCDEFGHIJKLMNOPQRSTUVWXYZ'
检查是否
用户名与密码
是否相同
IF
NLS_LOWER(password)
NLS_LOWER(username)
THEN
raise_application_error(-20001,
Password
same
as
or
similar
to
user'
);
END
IF;
检查密码的长度是否符合要求.
length(password)
<
10
raise_application_error(-20002,
length
less
than
10'
检查密码是否是简单的单词
(这一段理论上执行不到,因为前面加了密码长度大于
的限制)
IN
('
welcome'
database'
account'
password'
oracle'
computer'
abcd'
too
simple'
检查密码是否至少包含
一个
数字、一个小写字母,一个大写字母.
1.
检查数字
默认
密码中没有数字.
isdigit:
=FALSE;
取得密码长度.
:
length(password);
从
0-9
循环
FOR
i
1..10
LOOP
遍历密码中的每一个字符.
j
1..m
substr(password,j,1)
substr(digitarray,i,1)
如果
存在
数字字符,设置
“密码中有数字”
=TRUE;
跳出循环,进入到
检查小写字符的部分.
GOTO
findchar_lower;
LOOP;
FALSE
raise_application_error(-20003,
should
contain
at
least
one
digit,
Upper
character
and
Lower
character'
2.
检查小写字符.
findchar_lower>
>
密码中没有小写字符.
ischar_lower:
a
-
z
循环.
1..length(chararray_lower)
substr(chararray_lower,i,1)
小写字母字符,设置
“密码中有小写字母”
检查大写字符的部分.
findchar_upper;
3.
检查大写字符.
findchar_upper>
密码中没有大写字符.
ischar_upper:
A
Z
1..length(chararray_upper)
substr(chararray_upper,i,1)
大写字母字符,设置
“密码中有大写字母”
跳出循环,
本次新密码已经包含了
大写字母与小写字母.
endsearch;
endsearch>
检查新密码与旧密码,
是否至少有3个字母的变更.
IS
NOT
NULL
首先获取
密码长度的差异.
length(old_password)
密码长度的差异
小于3,
那么需要进一步判断了.
abs(differ)
设置
长度比较小的那个密码的长度.
ELSE
length(old_password);
abs(differ);
新旧密码字符比较.
substr(password,i,1)
!
substr(old_password,i,1)
1;
raise_application_error(-20004,
by
characters'
Everything
is
fine;
return
TRUE
RETURN(TRUE);
END;
/
上面的存储过程,
需要用
conn
/
sysdba
登录到
Oracle
后进行创建.
否则后面创建
PROFILE
的时候,
会出错。
存储过程创建完毕以后,创建一个
PROFILE
my_profile
VERIFY_FUNCTION;
因为我其他全部使用默认值,
仅仅修改一个
PASSWORD_VERIFY_FUNCTION
因此这里创建的时候,
就仅仅指定一行.
然后修改一个测试用户的
ALTER
USER
test_user
my_profile;
然后尝试修改这个
测试用户的密码
alter
user
identified
"
123"
*
第
1
行出现错误:
ORA-28003:
指定口令的口令验证失败
ORA-20002:
10
1234567890"
ORA-20003:
and
character
1234567890A"
1234567890Aa"
用户已更改。