2010-08-26 74 views
3

當使用oracle形式生成md5散列時,我得到的結果與tomcat給出的結果不同。Oracle和tomcat md5哈希之間的區別?

使用Tomcat消化的時候,我得到:

C:\apache-tomcat-6.0.26\bin>digest -a md5 mypass 
mypass:a029d0df84eb5549c641e04a9ef389e5 

同時使用Oracle的形式,我得到:

a029d0dfbfeb5549c641e04abff3bfe5

這是代碼:

Declare 
    v_checksum varchar2(32); 
    v_hex_value varchar2(32); 
begin 
    v_checksum := SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => 'mypass'); 


    SELECT LOWER(RAWTOHEX(v_checksum)) 
    INTO v_hex_value 
    FROM dual; 

    :res := v_hex_value; 
end; 

他們爲什麼不給出相同的結果?我的代碼有什麼問題嗎?

+0

FWIW我在C#中測試同意tomcat的。爲突出顯示差異,Oracle用相同的值(0xbf)替換了三個字節(0x84,9e,89)。乍一看,在你的哈希0x80-0x9f範圍內沒有其他字節。 – Rup 2010-08-26 11:29:28

+0

有無論如何你可以追蹤'v_checksum'?如果這是錯誤的,那麼問題出在MD5調用中,但值得確保錯誤是由某種轉換步驟觸發的。 – Rup 2010-08-26 11:39:17

回答

2

你運行甲骨文的版本?您的代碼給出了很好的答案上10.2.0.3.0:

SQL> VARIABLE res VARCHAR2(32); 
SQL> Declare 
    2  v_checksum varchar2(32); 
    3  v_hex_value varchar2(32); 
    4 begin 
    5  v_checksum:=SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(input_string=>'mypass'); 
    6 
    7 
    8  SELECT LOWER(RAWTOHEX(v_checksum)) 
    9  INTO v_hex_value 
10  FROM dual; 
11 
12  :res := v_hex_value; 
13 end; 
14/

PL/SQL procedure successfully completed 
res 
--------- 
a029d0df84eb5549c641e04a9ef389e5 

我也試過其他MD5功能,他們給出了相同的答案:

SQL> DECLARE 
    2  l_input RAW(16) := utl_raw.cast_to_raw('mypass'); 
    3 BEGIN 
    4  :res:=lower(rawtohex(dbms_obfuscation_toolkit.md5(input=>l_input))); 
    5 END; 
    6/

PL/SQL procedure successfully completed 
res 
--------- 
a029d0df84eb5549c641e04a9ef389e5 
+0

你的第二種方法適用於我。 我使用的是oracle 10.2.0.1.0。 我不知道爲什麼我有這兩種方法之間的差異! – mohamida 2010-08-26 12:22:06

+3

@mohamida:你將'rawtohex'函數應用於一個字符串(VARCHAR2),我不確定這是否是合適的用法(它應該應用於RAW) - 也許這就是爲什麼你看到區別。 – 2010-08-26 12:27:45

0

您的代碼似乎是正確的

我也得到a029d0df84eb5549c641e04a9ef389e5這裏http://md5hashgenerator.com/index.php

,並在SQL Server中,我得到了相同的

SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'mypass'),2)