2011-07-27 49 views
14

Im tratando de codificar algunas cadenas a MD5, pero me he dado cuenta de que:hash MD5 con diferentes resultados

Para la cadena: "123456çñ"

algunas webs como

http://www.md5.net

www .md5.cz

md5generator.net

retorno: "66f561bb6b68372213dd9768e55e1002"

y otros como:

http://www.adamek.biz/md5-generator.php

7thspace.com/webmaster_tools/online_md5_encoder.html

md5.rednoize.com/

retorno: "9e6c9a1eeb5e00fbf4a2cd6519e0cfcb "

Tendría que codificar las cadenas con md5 estándar porque ne ed para conectar mis resultados con otros sistemas. cual hash es el correcto?

Gracias de antemano

+4

Algo me dice que es un problema de codificación ... – Mehrdad

Respuesta

18

El problema es que supongo en diferentes codificaciones de texto. La cadena que muestra no se puede representar en codificación ANSI; requiere UTF-16 o UTF-8. La elección de uno de estos últimos conduce a una representación de bytes diferente de la cadena y produce diferentes valores hash.

Recuerde, MD5 hash bytes, no caracteres: le corresponde a usted cómo codificar esos caracteres como bytes antes de alimentar bytes a MD5. Si desea interoperar con otros sistemas, debe usar la misma codificación que esos sistemas.

+5

Ooo, vencerme por 25 segundos :) Eso me enseñará a perder el tiempo recomendando SHA2. –

2

Supongo que algunos de estos sitios no están manejando correctamente los caracteres no ascii. Si está utilizando una biblioteca md5 estándar, entonces debería estar bien, siempre que usted y el sistema al que se está conectando estén de acuerdo con la codificación de caracteres que utiliza.

Por cierto, ya no se recomienda el uso de MD5. Si esto es para propósitos criptográficos, entonces realmente debería mudarse a SHA2.

7

Usemos Python para entender esto.

>>> '123456çñ' 
'123456\xc3\xa7\xc3\xb1' 
>>> 'ç' 
'\xc3\xa7' 
>>> 'ñ' 
'\xc3\xb1' 

En la salida anterior, vemos la codificación UTF-8 de 'C' y 'N'.

>>> md5('123456çñ').digest().encode('hex') 
'66f561bb6b68372213dd9768e55e1002' 

lo tanto, cuando se calcula hash MD5 de los datos de codificación UTF-8, obtenemos el primer resultado.

>>> u'ç' 
u'\xe7' 
>>> u'ñ' 
u'\xf1' 

Aquí, vemos los puntos de código Unicode de 'ç' y 'ñ'.

>>> md5('123456\xe7\xf1').digest().encode('hex') 
'9e6c9a1eeb5e00fbf4a2cd6519e0cfcb' 

lo tanto, cuando se calcula el hash MD5 de los datos representados con los puntos de código Unicode de cada carácter de la cadena (posiblemente codificado ISO-8859-1), obtenemos el segundo resultado.

Por lo tanto, el primer sitio web está calculando el hash de los datos codificados UTF-8, mientras que el segundo no.

4

si trato:

echo "123456çñ<br />"; 
echo "utf-8 : ".md5("123456çñ")."<br />"; 
echo "ISO-8859-1 : ".md5(iconv("UTF-8", "ISO-8859-1","123456çñ"))."<br />"; 

Se da el resultado:

123456çñ 
utf-8 : 66f561bb6b68372213dd9768e55e1002 
ISO-8859-1 : 9e6c9a1eeb5e00fbf4a2cd6519e0cfcb 

El primer sitio web codificar la cadena en la norma ISO-8859-1 y el segundo en UTF-8.

Cuestiones relacionadas