1, 口令文件信息查询 口令文件中存储着拥有sysdba或者sysoper权限的用户. 这里我们首先检查一下每个系统中有哪些用户拥有管理权限. 使用语句select * from v$pwfile_users可以完成这步操作. USERNAME SYSDBA SYSOPER SYS TRUE TRUE CTLKF TRUE FALSE 2, 查询用户的资源信息 select du.username, du.profile, dp.resource_name,dp.limit from dba_users DU, dba_profiles DP where du.profile = dp.profile and dp.resource_name in ('FAILED_LOGIN_ATTEMPTS', --允许用户输入多少次口令错误,超过允许次数后,账号被锁定 'PASSWORD_VERIFY_FUNCTION', --密码验证函数 'PASSWORD_LOCK_TIME', --锁定用户的时间(单位为天) 'PASSWORD_LIFE_TIME', --口令的有效期, 过期提醒 'PASSWORD_GRACE_TIME' , --口令的提醒天数, 这期间口令仍然可用 'PASSWORD_REUSE_MAX', -- 口令历史记录保留次数 'PASSWORD_REUSE_TIME' -- 口令历史记录保留时间 ) order by du.username; USERNAME PROFILE RESOURCE_NAME LIMIT SYS DEFAULT FAILED_LOGIN_ATTEMPTS UNLIMITED SYS DEFAULT PASSWORD_LIFE_TIME UNLIMITED SYS DEFAULT PASSWORD_GRACE_TIME UNLIMITED SYS DEFAULT PASSWORD_LOCK_TIME UNLIMITED SYS DEFAULT PASSWORD_VERIFY_FUNCTION NULL 3. 修改口令资源 也可以使用下面的语句完成同样的效果. ALTER PROFILE "DEFAULT" FAILED_LOGIN_ATTEMPTS 5 --允许用户输入多少次口令错误,超过允许次数后,账号被锁定 PASSWORD_VERIFY_FUNCTION verify_Function --密码验证函数 PASSWORD_LOCK_TIME 0.0416 --锁定用户的时间(单位为天) PASSWORD_LIFE_TIME unlimited --口令的有效期, 过期提醒 PASSWORD_GRACE_TIME unlimited --口令的提醒天数, 这期间口令仍然可用 PASSWORD_REUSE_MAX 1 -- 口令历史记录保留次数 PASSWORD_REUSE_TIME unlimited -- 口令历史记录保留时间 4,口令复杂性检查函数 口令复杂性检查函数password_verify_function是oracle中自带的, 作为复杂性函数中的default检查函数, 但是缺省这个函数没有创建, 需要运行在oracle软件主目录下的rdbms/admin下的utlpwdmg.sql才可以使用. SQL> conn sys/sys as sysdba 已连接。 SQL> @E:/oracle/ora92/rdbms/admin/utlpwdmg.sql 函数已创建。 配置文件已更改 默认的函数可以检查密码是否与用户名相同, 是否小于4个字符, 是否是一组特定的词, 密码中是否包含一个字符, 一个数字和一个标点符号, 然后再和旧口令进行对照. 当然,用户也可以修改或者创建自己的口令复杂度函数, 然后启用. 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(密码长度必须大于等于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) < 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; 5, 修改用户密码 1, 使用alter user 使用sysdba权限用户登录后, 可以用下属语句修改用户密码. Alter user username identified by password; 2, 使用password SQL> password 更改SYS的口令 旧口令: 新口令: 重新键入新口令: 口令已更改 3, 修改超级用户sys密码 A, 使用conn / as sysdba 登录, 然后使用alter user sys identified by password B, 删除口令文件, 然后在dos控制台使用orapwd修改. C:/Documents and Settings/Administrator>orapwd Usage: orapwd file=
password=
entries=
where file - name of password file (mand), password - password for SYS (mand), entries - maximum number of distinct DBA and OPERs (opt), There are no spaces around the equal-to (=) character. C:/Documents and Settings/Administrator>orapwd file=PWDordDB.ora password=sys.47522341 entries=5 6, 强制过期所有用户密码 begin for myrec in ( select username from dba_users ) loop execute immediate 'alter user '||myrec.username||' password expire'; end loop; end; -- 强制修改所有用户密码 begin for myrec in ( select username from dba_users ) loop execute immediate 'alter user '||myrec.username||' identified by '||myrec.username||'_47522341'; end loop; end; 7, 测试修改口令后需要的工作量. 1, C/S环境. 环境建立: 在delphi中创建oracle连接, 设置密码, 打开一个数据表. 测试目的: 将密码过期后, 查看再次登录是否需要修改密码. 测试结论: 如果用户强制将密码过期, 那么所有已经发布的登录也要在修改完密码后重新配置连接字符串.
oracle口令管理
最新推荐文章于 2024-06-25 08:57:21 发布