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

Oracle APEX中能否用DBMS_CRYPTO生成与Perl crypt一致的哈希?

问题解答

核心问题:Perl crypt与Oracle DBMS_CRYPTO的哈希一致性

如果旧系统的Perl crypt 使用的是标准DES算法(对应2字符盐值,盐值字符集为[a-zA-Z0-9./]),Oracle的DBMS_CRYPTO可以生成完全一致的哈希值,但需要严格匹配算法与字节处理逻辑:

  • 盐值必须完全复用旧系统的对应值,且仅取前2个有效字符
  • 需确保Oracle端密码、盐值的字节编码与旧系统一致(通常为ASCII)
  • 使用DBMS_CRYPTO.HASH_DES算法进行加密

示例PL/SQL实现:

DECLARE
    v_pw VARCHAR2(100) := '商户登录密码';
    v_salt VARCHAR2(2) := '旧系统存储的盐值';
    v_crypted VARCHAR2(13);
BEGIN
    v_crypted := UTL_RAW.CAST_TO_VARCHAR2(
        DBMS_CRYPTO.CRYPT(
            UTL_RAW.CAST_TO_RAW(v_pw),
            DBMS_CRYPTO.HASH_DES,
            UTL_RAW.CAST_TO_RAW(v_salt)
        )
    );
    DBMS_OUTPUT.PUT_LINE(v_crypted);
END;
/

替代方案:CGI脚本+APEX Web Service哈希处理

你提出的CGI方案完全可行,能彻底规避Oracle端算法兼容问题,无需数据库维护或导入JAR包:

  1. 封装Perl crypt逻辑为CGI接口:
#!/usr/bin/perl
use CGI;
my $cgi = CGI->new;
my $pw = $cgi->param('password');
my $salt = $cgi->param('salt');
my $cpw = crypt($pw, $salt);
print $cgi->header('text/plain');
print $cpw;
  1. 在APEX中调用该接口获取哈希值:
DECLARE
    v_pw VARCHAR2(100) := '商户输入的密码';
    v_salt VARCHAR2(2) := '旧系统对应的盐值';
    v_response CLOB;
BEGIN
    v_response := apex_web_service.make_rest_request(
        p_url => 'http://你的CGI脚本地址/crypt_handler.cgi',
        p_http_method => 'POST',
        p_body => 'password=' || utl_url.escape(v_pw) || '&salt=' || utl_url.escape(v_salt)
    );
    -- 使用v_response作为哈希值完成登录验证或存储
END;
/

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:25:31