2009-08-04 4 views
11

Sto provando a confrontare un checksum MD5 generato da PHP a uno generato da Oracle 10g. Tuttavia sembra che sto confrontando le mele con le arance.Come ottenere MD5 di Oracle in modo che corrisponda all'MD5 di PHP

Ecco quello che ho fatto per testare il confronto:

//md5 tests 

    //php md5 
    print md5('testingthemd5function'); 

    print '<br/><br/>'; 

    //oracle md5 
    $md5query = "select md5hash('testingthemd5function') from dual"; 

    $stid = oci_parse($conn, $md5query); 
    if (!$stid) { 
    $e = oci_error($conn); 
    print htmlentities($e['message']); 
    exit; 
    } 

    $r = oci_execute($stid, OCI_DEFAULT); 
    if (!$r) { 
    $e = oci_error($stid); 
    echo htmlentities($e['message']); 
    exit; 
    } 

    $row = oci_fetch_row($stid); 
    print $row[0]; 

La funzione md5 (visto nella query sopra) in Oracle utilizza il pacchetto 'dbms_obfuscation_toolkit.md5' e viene definito come questo (?):

CREATE OR REPLACE FUNCTION PORTAL.md5hash (v_input_string in varchar2) return varchar2  
is 
    v_checksum varchar2(20); 
    begin 
    v_checksum := dbms_obfuscation_toolkit.md5 (input_string => v_input_string); 
    return v_checksum; 
end; 

quello che esce sulla mia pagina PHP è:

29dbb90ea99a397b946518c84f45e016 

)Û¹©š9{”eÈOEà 

qualcuno mi può aiutare a get ting i due per abbinare?

risposta

14

Restituisce byte non elaborati, è necessario convertirlo in esadecimale.

$x = unpack("H*", $row[0]); 
echo $x[1]; 
+0

grazie, che ha funzionato come un fascino – Zenshai

7

Sembra che quello che viene stampato dalla query Oracle sia il grezzo test del checksum md5, storpiato perché la maggior parte di quegli ottetti non saranno caratteri ascii. Prova prima a convertirlo in esadecimale.

2

Nel caso in cui si vorrebbe avere il md5 in Oracle, è possibile utilizzare questo metodo:

select lower(rawtohex(md5hash('foobar'))) from dual 
+0

Quando provo a ricomporre la mia chiamata in quel modo - rawtohex (dbms_obfuscation_toolkit.md5 (input_string => TEXT)) - mi dice "errore numerico o valore: esadecimale errore di conversione", che è divertente dato che sto cercando di convertire raw in hex hex in raw. – eidylon

1

ho ottenuto lo stesso "errore di valore o numerico" e ha scoperto che due funzioni insieme funzionano:

CREATE OR REPLACE FUNCTION MD5RAW(v_input_string in varchar2) 
RETURN varchar2 IS 
v_checksum varchar2(32); 
BEGIN 
    v_checksum := SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => v_input_string); 
    return v_checksum; 
END; 

CREATE OR REPLACE FUNCTION MD5HEX(v_input_string in varchar2) 
RETURN varchar2 IS 
v_hex_value varchar2(32); 
BEGIN 
    SELECT LOWER(RAWTOHEX(MD5RAW(v_input_string))) 
    INTO v_hex_value 
    FROM dual; 
    return v_hex_value; 
END; 

Quindi è possibile eseguire la query per ottenere la vostra checksum:

SELECT md5hex('my string smoked your hash') FROM dual; 

Questa seconda funzione ha la stessa funzione dell'emissione dell'istruzione SELECT fornita da Bazz sulla funzione fornita, ma preferisco non dover eseguire rawToHex -> conversione inferiore all'interno di ogni query. Questo lascia troppe cose per potenzialmente andare storto ogni volta che usi la query. Penso che potrebbe essere anche più veloce poiché è compilato in fase di creazione anziché in fase di esecuzione, ma potrei sbagliarmi.

3

Creare una funzione simile al seguente:

create or replace 
function md5(input varchar2) return sys.dbms_obfuscation_toolkit.varchar2_checksum as 
begin 
    return lower(rawtohex(utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5(input_string => input)))); 
end; 

e chiamare in questo modo:

select md5('foobar') from dual; 

sembra che "dbms_obfuscation_toolkit.md5" non restituisce realmente in formato raw, da qui la necessità chiamare "utl_raw.cast_to_raw". Potrei sbagliarmi, dovrebbe esserci una spiegazione migliore per questo.