2010-08-26 1 views
3

при использовании форм оракула для генерации хэша md5, я получаю результат, отличный от результата, данного tomcat.Различия между Oracle и tomcat md5 хешем?

при использовании кот переваривать, я получаю:

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

при использовании оракула форм, я получаю:

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# согласующуюся с котом. Чтобы подчеркнуть разницу, Oracle заменила три байта (0x84, 9e, 89) с тем же значением (0xbf). На первый взгляд в вашем хеше нет байтов в диапазоне 0x80-0x9f. – Rup

+0

В любом случае вы можете проследить 'v_checksum'? Если это не так, проблема возникает в вызове MD5, но стоит убедиться, что ошибка была вызвана одним из шагов преобразования каким-то образом. – Rup

ответ

2

, какая версия Oracle вы используете? Ваш код дает хороший ответ на 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

+3

@mohamida: вы применяете функцию rawtohex к строке (VARCHAR2), я не уверен, что это подходящее использование (оно должно применяться к RAW) - возможно, именно поэтому вы видите разница. –

0

Ваш код кажется правильным

Я также получаю a029d0df84eb5549c641e04a9ef389e5 здесь http://md5hashgenerator.com/index.php

, а также в SQL-сервере я получаю то же самое

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