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包:
- 封装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;
- 在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
相关产品推荐
相关产品推荐

