You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle APEX中用户密码哈希加密及DBMS_CRYPTO未声明报错咨询

在Oracle APEX中实现密码哈希存储的方法

先解决DBMS_CRYPTO的权限错误

你遇到的"identifier 'DBMS_CRYPTO' must be declared"错误,本质是当前APEX应用对应的数据库用户没有执行DBMS_CRYPTO包的权限。执行下面的SQL给用户授权(替换成你的实际用户名):

GRANT EXECUTE ON SYS.DBMS_CRYPTO TO 你的APEX应用数据库用户名;

两种实现密码哈希的方式

方式一:用DBMS_CRYPTO自定义哈希逻辑

推荐用SHA-256/SHA-512这类安全哈希算法,别用MD5。

1. 先建一个复用的哈希函数(可选)

在数据库里创建自定义函数,后续调用更方便:

CREATE OR REPLACE FUNCTION hash_password(p_password IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
  RETURN RAWTOHEX(DBMS_CRYPTO.HASH(
    UTL_I18N.STRING_TO_RAW(p_password, 'AL32UTF8'),
    DBMS_CRYPTO.HASH_SH256
  ));
END;
/

然后给APEX用户授权执行这个函数:

GRANT EXECUTE ON hash_password TO 你的APEX应用数据库用户名;

2. 在APEX页面处理中调用

比如在提交密码的页面,新增一个PL/SQL类型的页面处理,代码如下:

INSERT INTO 你的用户表(用户名, 密码哈希)
VALUES (:P1_USERNAME, hash_password(:P1_PASSWORD));

不想用自定义函数的话,直接写完整逻辑也可以:

INSERT INTO 你的用户表(用户名, 密码哈希)
VALUES (
  :P1_USERNAME,
  RAWTOHEX(DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(:P1_PASSWORD, 'AL32UTF8'), DBMS_CRYPTO.HASH_SH256))
);

方式二:用APEX自带的APEX_UTIL.GET_HASH(更省心)

APEX内置了哈希函数,不需要额外授权DBMS_CRYPTO,直接用就行,还支持加盐(提高安全性):

INSERT INTO 你的用户表(用户名, 密码哈希)
VALUES (
  :P1_USERNAME,
  APEX_UTIL.GET_HASH(
    p_string => :P1_PASSWORD,
    p_salt => :P1_USERNAME, -- 用用户名当盐值,避免相同密码产生一样的哈希
    p_algorithm => 'SHA-256'
  )
);

密码验证逻辑

用户登录时,把输入的密码重新哈希后和数据库里的存储值对比:

SELECT 1
FROM 你的用户表
WHERE 用户名 = :P1_USERNAME
  AND 密码哈希 = APEX_UTIL.GET_HASH(p_string => :P1_PASSWORD, p_salt => :P1_USERNAME, p_algorithm => 'SHA-256');

如果查询返回结果,说明密码正确。

内容的提问来源于stack exchange,提问作者Safwen Hafsawy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:23:34