2010-08-10 21 views
17

Básicamente estoy creando una API en php, y uno de los parámetros que aceptará es un valor md5 encriptado. No tengo mucho conocimiento de los diferentes lenguajes de programación y también sobre el MD5. Así que mi pregunta básica es, si estoy aceptando md5 valores encriptados, el valor seguirá siendo el mismo, generado desde cualquier lenguaje de programación como .NET, Java, Perl, Ruby ... etc.¿La salida de la función hash criptográfica MD5 será la misma en todos los lenguajes de programación?

O habría alguna limitación o validaciones para ello

+8

Debe usar SHA512. – SLaks

+5

está utilizando un valor hash md5 no cifrado. El cifrado y el hash no son lo mismo. – Chris

+1

@Chris, mientras que los méritos del método son discutibles, puede utilizar un algoritmo hash para el cifrado de 1 vía. – corsiKa

Respuesta

25

Sí, la implementación correcta de md5 producirá el mismo resultado, de lo contrario, md5 no sería útil como suma de comprobación. La diferencia puede venir con la codificación y byte order. Debe estar seguro de que el texto está codificado en exactamente la misma secuencia de bytes.

+7

Debe mencionarse que hacer que las cosas tengan * exactamente * los mismos bytes es un problema no trivial.Codificación de texto, orden de bytes, la lista continúa. –

+3

También finales de línea: tuve un error realmente molesto cuando los md5sums no coincidían en varios sistemas, y resultó que algunos sistemas eliminaban la línea nueva posterior del texto de entrada, y otros no. – Ether

+1

Tu respuesta implica el carrito antes que el caballo. Se supone que MD5 te ofrece una forma de garantizar que obtuviste los mismos bytes exactos. Travis tiene razón en que no es un problema trivial. Es por eso que estas sumas de comprobación existen, es para asegurarse de obtener exactamente los mismos bytes. – corsiKa

5

Sí. MD5 no es una función de cifrado, es un hash function que utiliza un algoritmo específico.

3

Sí, los valores hash md5 siempre serán los mismos, independientemente de su origen, siempre que el algoritmo subyacente se implemente correctamente.

3

Un punto vital de las funciones hash seguras, como MD5, es que siempre producen el mismo valor para la misma entrada.

Sin embargo, sí es necesario codificar los datos de entrada en una secuencia de bytes (o bits) de la misma manera. Por ejemplo, hay muchas maneras de codificar una cadena.

14

Lo hará, pero hay un pero.

Lo hará porque está diseñado para producir confiablemente el mismo resultado dado una serie repetida de bytes; el punto es que podemos comparar los resultados para verificar que los bytes no hayan cambiado, o tal vez firmar digitalmente el MD5 resultado en lugar de firmar la fuente completa.

pero es que una fuente común de errores es hacer suposiciones sobre cómo se codifican las cadenas. MD5 funciona en bytes, no en caracteres, por lo que si usamos una cadena para hash, realmente estamos mezclando una determinada codificación de esa cadena. Algunos lenguajes (y más aún, algunos tiempos de ejecución) favorecen codificaciones particulares, y algunos programadores están acostumbrados a hacer suposiciones sobre esa codificación. Peor aún, algunas especificaciones pueden hacer suposiciones sobre codificaciones. Esto puede ser una causa de errores donde dos implementaciones diferentes producirán diferentes hash MD5 para la misma cadena. Esto es especialmente así en los casos en que los caracteres están fuera del rango U + 0020 a U + 007F (y dado que U + 007F es un control, ese tiene sus propios problemas).

Todo esto se aplica a otros valores hash criptográficos, como la familia de valores hash SHA.

+0

Gracias por explicarlo, y según tengo entendido, desde su punto de vista, en la medida en que la codificación de las cadenas sea la misma, producirá el mismo hash md5 independientemente del lenguaje de programación. Gracias – jtanmay

+0

Sí, y la nueva línea tiene que ser la misma también. MD5 garantiza el resultado correcto con el mismo conjunto de bytes, no proporciona los bytes correctos en los que se producen los errores. –

+0

Para hacerlo divertido, algunos lenguajes de programación pueden agregar una marca de orden de bytes cuando el texto está codificado usando uno de los esquemas de codificación Unicode. Incluso he visto que UTF-8 BOM se usa en la naturaleza. Obviamente, esto dará como resultado diferentes hash MD5. Además, algunas implementaciones generarán una versión codificada * del hash, p. Ej. PHP producirá felizmente una cadena hexadecimal de 32 dígitos en lugar de 16 bytes de forma predeterminada. –

Cuestiones relacionadas