Oracle 21c中用DBMS_CRYPTO替代DBMS_OBFUSCATION_TOOLKIT修改HASH_PASSWORD函数
将HASH_PASSWORD函数从DBMS_OBFUSCATION_TOOLKIT迁移到DBMS_CRYPTO
Oracle 21c(含MAXAPEX云环境)已弃用DBMS_OBFUSCATION_TOOLKIT包,需改用DBMS_CRYPTO包实现相同的MD5哈希逻辑。以下修改后的函数完全保留原盐值拼接规则,确保输出结果与原函数一致:
修改后的函数代码
create or replace FUNCTION HASH_PASSWORD (p_user_name in varchar2, p_password in varchar2) return varchar2 is l_password varchar2(255); -- 示例盐值,建议替换为随机字符串 l_salt varchar2(255) := '2345USFGOJN2T3HW89EFGOBN23R5SDFGAKL'; l_input_string varchar2(1000); -- 存储拼接后的输入字符串 begin -- 保留原有的输入拼接逻辑 l_input_string := p_password || substr(l_salt,4,14) || p_user_name || substr(l_salt,5,10); -- 使用DBMS_CRYPTO.MD5哈希,先转RAW处理,再转回字符串 l_password := utl_raw.cast_to_varchar2( utl_raw.hex_encode( dbms_crypto.hash( utl_raw.cast_to_raw(l_input_string), dbms_crypto.hash_md5 ) ) ); return l_password; end hash_password; /
关键修改说明
- 替换
DBMS_OBFUSCATION_TOOLKIT.MD5为DBMS_CRYPTO.HASH,指定哈希类型为DBMS_CRYPTO.HASH_MD5 DBMS_CRYPTO.HASH仅接收RAW类型输入,需先用UTL_RAW.CAST_TO_RAW转换拼接后的字符串;哈希结果通过UTL_RAW.HEX_ENCODE转成十六进制字符串,最后用UTL_RAW.CAST_TO_VARCHAR2转为可返回的VARCHAR2类型- 完全保留原函数的盐值截取、输入拼接逻辑,保证哈希结果与原函数完全一致
注意事项
- 确保当前用户拥有
DBMS_CRYPTO包的执行权限,若缺失可通过以下语句授权:GRANT EXECUTE ON SYS.DBMS_CRYPTO TO your_user_name; - 原函数中被注释的逻辑未改动,若需启用可自行取消注释。
内容的提问来源于stack exchange,提问作者Ziad Adnan
相关产品推荐
相关产品推荐

