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
相关产品推荐
相关产品推荐

