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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:22:50