Oracle APEX 21.1如何创建用户登录密码修改页面?
问题1:是否可通过APEX 21.1标准功能直接实现
分两种场景判断:
- 如果你使用APEX默认的内置工作区用户认证(账号存储在APEX工作区用户库,而非自建业务表):完全不需要自定义开发。直接进入应用的「认证方案」配置页,找到「密码管理」板块,开启「允许最终用户修改密码」选项,APEX会自动提供密码修改入口,内置密码强度校验、旧密码验证、密码更新全流程逻辑,不需要手动建页面、写更新逻辑。
- 如果你使用自定义用户表做认证(账号密码存储在自建业务表中,使用自定义认证校验逻辑):标准功能无法直接适配业务表,需要自定义开发改密页面。
问题2:自定义开发场景下的密码加密存储方案
核心原则:密码绝对不能明文存储,绝对不能使用可逆加密存储,必须使用带随机盐的强密码哈希算法。APEX 21.1已经提供官方封装的密码安全组件,不需要自行实现加密逻辑,具体实现步骤如下:
- 调整用户表结构
存储密码哈希的字段类型设置为VARCHAR2(200 CHAR)及以上长度,不要给该字段建模糊查询索引、不要配置大小写不敏感排序规则,仅做等值匹配使用。 - 密码哈希处理
不要自行实现MD5、SHA1、固定盐SHA256这类已被验证不安全的逻辑,直接调用APEX内置的、专门用于密码存储的APEX_UTIL.HASH_PASSWORD函数。该函数内部自动生成随机盐、使用抗暴力破解的慢哈希算法,返回值已经包含盐值和哈希结果,不需要额外单独存储盐值。
页面提交后执行的更新逻辑参考如下PL/SQL代码:-- 先完成非空、密码强度规则校验,再执行更新 UPDATE YOUR_CUSTOM_USER_TABLE SET USER_PASSWORD_HASH = APEX_UTIL.HASH_PASSWORD(p_password => :P9901_NEW_PASSWORD) WHERE USER_NAME = :APP_USER; - 配套安全校验
- 改密页必须增加旧密码输入项,提交时先校验用户输入的旧密码和库中存储的哈希值是否匹配,校验通过才允许更新,防止会话被盗后直接篡改密码。校验旧密码可以直接用
APEX_UTIL.IS_PASSWORD_VALID函数,传入用户输入的旧密码和库中存储的哈希值即可得到匹配结果。 - 不要在代码里拼接明文密码,全程用绑定变量传值,避免SQL注入风险。
- 密码更新成功后,可以调用
APEX_AUTHENTICATION.LOGOUT强制用户重新登录,清除会话缓存。
- 改密页必须增加旧密码输入项,提交时先校验用户输入的旧密码和库中存储的哈希值是否匹配,校验通过才允许更新,防止会话被盗后直接篡改密码。校验旧密码可以直接用
注意:不要用
DBMS_CRYPTO包的通用哈希函数存密码,这类函数为快速数据校验设计,哈希计算速度太快,暴力破解成本极低,不适合密码存储场景。
内容的提问来源于stack exchange,提问作者Mika Takaki
相关产品推荐
相关产品推荐

