2009-08-04 38 views
11

Estoy tratando de comparar una suma de comprobación MD5 generada por PHP con una generada por Oracle 10g. Sin embargo, parece que estoy comparando manzanas con naranjas.Conseguir que el MD5 de Oracle coincida con el MD5 de PHP

Aquí es lo que hice para poner a prueba la comparación:

//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 función md5 (visto en la consulta anterior) en Oracle utiliza el paquete 'dbms_obfuscation_toolkit.md5' y se define como esto (?):

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; 

lo que sale en mi página PHP es:

29dbb90ea99a397b946518c84f45e016 

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

¿Puede alguien ayudarme en get Ting los dos para que coincida?

Respuesta

14

Devuelve bytes sin procesar, debe convertirlos en hexadecimal.

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

gracias, eso funcionó como un amuleto – Zenshai

7

Parece que lo que se imprime a partir de la consulta de Oracle es la copia de prueba sin procesar de la suma de comprobación md5, porque la mayoría de esos octetos no serán caracteres ASCII. Intenta convertirlo a hexadecimal primero.

2

En caso de que desee tener el MD5 en Oracle, puede utilizar este método:

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

Cuando intento ajustar mi llamada así - rawtohex (dbms_obfuscation_toolkit.md5 (input_string => TEXT)) - me dice "error numérico o de valor: error de conversión hexadecimal a bruto", que es gracioso ya que estoy tratando de convertir en crudo a hexadecimal no hexadecimal a crudo. – eidylon

1

me dieron el mismo "error numérico o valor" y se encontró que dos funciones juntas funcionan:

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; 

a continuación, puede ejecutar esta consulta para obtener su suma de comprobación:

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

Esa segunda función hace lo mismo que emitir la instrucción SELECT proporcionada por Bazz en la función que proporciona, pero prefiero no tener que hacer la conversión rawToHex -> inferior dentro de cada consulta. Eso deja demasiadas cosas que potencialmente pueden salir mal cada vez que usa la consulta. Creo que puede ser más rápido también, ya que se compila en el momento de la creación en lugar de en el tiempo de ejecución, pero puedo estar equivocado al respecto.

3

Crear una función como la siguiente:

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; 

y lo llaman así:

select md5('foobar') from dual; 

parece que "dbms_obfuscation_toolkit.md5" en realidad no retorno en formato RAW, de ahí la necesidad para llamar a "utl_raw.cast_to_raw". Sin embargo, podría estar equivocado, debería haber una mejor explicación para esto.