自定义的Oracle用户密码效验程序

来源:语言推理作者:缅甸程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《自定义的Oracle用户密码效验程序》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《自定义的Oracle用户密码效验程序》有用,将其分享出去将是对创作者最好的鼓励。

在Oracle数据库的默认配置中,密码策略仅支持简单的复杂度校验,无法满足企业对于密码安全性、合规性的特殊要求,自定义密码效验程序可以让管理员根据自身需求灵活定义校验规则,从根源上提升用户账户的安全性。

自定义的Oracle用户密码效验程序

自定义密码效验程序的核心原理

Oracle数据库支持通过配置PASSWORD_VERIFY_FUNCTION参数来指定自定义的密码校验函数,当用户创建或修改密码时,系统会自动调用该函数执行校验逻辑,若函数返回成功则允许密码修改,若返回失败则提示错误并拒绝修改。

自定义的校验函数需要满足Oracle的规范要求:必须是PL/SQL函数,接收用户名和密码作为参数,返回布尔类型的结果,同时需要有权限被数据库调用。

编写自定义密码效验函数

以下是一个满足常见安全要求的校验函数示例,规则包括:密码长度不小于8位、必须包含大小写字母和数字、不能与用户名相同、不能包含连续3个相同字符。

CREATE OR REPLACE FUNCTION custom_pwd_verify (
    username VARCHAR2,
    password VARCHAR2,
    old_password VARCHAR2
) RETURN BOOLEAN IS
    v_has_upper NUMBER := 0;
    v_has_lower NUMBER := 0;
    v_has_digit NUMBER := 0;
    v_len NUMBER;
BEGIN
    -- 检查密码长度
    v_len := LENGTH(password);
    IF v_len < 8 THEN
        RAISE_APPLICATION_ERROR(-20001, '密码长度不能小于8位');
    END IF;

    -- 检查密码不能与用户名相同
    IF UPPER(password) = UPPER(username) THEN
        RAISE_APPLICATION_ERROR(-20002, '密码不能与用户名相同');
    END IF;

    -- 检查是否包含大写字母、小写字母、数字
    FOR i IN 1..v_len LOOP
        IF SUBSTR(password, i, 1) BETWEEN 'A' AND 'Z' THEN
            v_has_upper := 1;
        ELSIF SUBSTR(password, i, 1) BETWEEN 'a' AND 'z' THEN
            v_has_lower := 1;
        ELSIF SUBSTR(password, i, 1) BETWEEN '0' AND '9' THEN
            v_has_digit := 1;
        END IF;
    END LOOP;

    IF v_has_upper = 0 OR v_has_lower = 0 OR v_has_digit = 0 THEN
        RAISE_APPLICATION_ERROR(-20003, '密码必须包含大小写字母和数字');
    END IF;

    -- 检查是否包含连续3个相同字符
    FOR i IN 1..v_len - 2 LOOP
        IF SUBSTR(password, i, 1) = SUBSTR(password, i+1, 1) 
           AND SUBSTR(password, i, 1) = SUBSTR(password, i+2, 1) THEN
            RAISE_APPLICATION_ERROR(-20004, '密码不能包含连续3个相同字符');
        END IF;
    END LOOP;

    RETURN TRUE;
EXCEPTION
    WHEN OTHERS THEN
        RETURN FALSE;
END custom_pwd_verify;
/

配置数据库启用自定义效验程序

函数创建完成后,需要将其关联到对应的用户配置文件(Profile),才能让规则生效,具体步骤如下:

1. 授予函数执行权限

需要将函数的执行权限授予给公共角色,确保数据库可以正常调用该函数:

GRANT EXECUTE ON custom_pwd_verify TO PUBLIC;

2. 修改Profile的校验参数

可以修改默认的DEFAULT配置文件,也可以创建新的配置文件,将PASSWORD_VERIFY_FUNCTION设置为自定义的函数名:

-- 修改DEFAULT配置文件
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION custom_pwd_verify;

-- 如果需要创建新的配置文件
CREATE PROFILE custom_profile LIMIT
    PASSWORD_VERIFY_FUNCTION custom_pwd_verify
    PASSWORD_LIFE_TIME 90
    PASSWORD_REUSE_TIME 180;

3. 将用户关联到对应Profile

如果使用了新的配置文件,需要将目标用户关联到该Profile:

ALTER USER test_user PROFILE custom_profile;

校验规则测试

配置完成后可以测试密码修改是否符合预期,以下是几种常见场景的测试结果:

测试场景密码内容预期结果
长度不足Abc123修改失败,提示密码长度不能小于8位
与用户名相同test_user修改失败,提示密码不能与用户名相同
缺少数字Abcdefgh修改失败,提示密码必须包含大小写字母和数字
符合规则Abc12345修改成功

常见问题排查

  • 如果修改密码时提示函数不存在,需要检查函数是否正确创建,以及是否授予了PUBLIC执行权限。
  • 如果校验规则不生效,需要检查用户的Profile是否正确关联了自定义校验函数,可以通过DBA_PROFILES视图查询配置。
  • 自定义函数中如果需要添加更多规则,比如禁止密码包含字典词汇,可以在函数中引入外部字典表进行校验。

Oracle密码效验程序PL/SQL用户安全策略密码规则修改时间:2026-06-07 00:18:01

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。