2011-03-06 15 views
6

¿Debo usar if(strcmp(md5($string),$hash)==0) o if(md5($string)==$hash)¿Cuál es la mejor manera de comparar cadenas hash? (PHP)

+0

Use 'strcmp' en las funciones de clasificación personalizadas. Para un uso "normal", la comparación directa de las cadenas es más fácil y fácil de leer. –

+6

Para cualquiera que lea este hilo, [es probable que no deba hacer eso ** en absoluto **] (http://phpsadness.com/sad/47). – ereOn

+1

Si solo quiere comparar hash de manera confiable, simplemente use '==='. Si realmente te preocupan la seguridad y los posibles ataques de sincronización (incluso a pesar de la inestabilidad de la red), deberías echar un vistazo a [esto] (https://github.com/delight-im/Faceless/issues/4) o [esto] (https://github.com/delight-im/Faceless/pull/5) debate o use la función 'hash_equals()' (PHP 5.6+). – caw

Respuesta

0

== se ha demostrado por otros usuarios aquí para ser extremadamente fiable. Debería usar strcmp() en su lugar.

Una tercera opción, si realmente desea utilizar un operador de comparación, es el uso de === que no realiza tipo de coacción de ninguna clase, y por lo tanto conserva tipos y valores para los fines de comparación.

+0

¿Cuál tiene mejor rendimiento? – webnat0

+0

==, porque solo una comparsión como mi publicación a continuación dijo –

+3

@ Da9: ... y no hay función de llamada. –

-4

Creo que if(md5($string) == $hash) es mejor, porque solo tiene una comparación en lugar de 2 (stcmp & ==).

md5 genera solo ascii-chars que no necesitan una comparación binaria segura.

+0

Mirar @MM respuesta. En segundo lugar, md5 está obsoleto (comprobado que puede ser pirateado). Usa sha (una mejor, no la mejor). – Symba

+0

Por supuesto, debes usar sha sobre md5. Pero el interrogador preguntó qué debería usar. Si alguien le pregunta: "¿Quiere un helado de fresa o un helado de chocolate?", No puede responder "Tomo helado de vainilla". Además, la pregunta no es sobre usar un algoritmo hash, sino sobre comparar valores. –

+0

No hablamos de helado aquí, sino de seguridad. Entonces, la respuesta es: "¡No utilices nada de lo que propones aquí!". Y BTW: Además, SHA-1 ** no debe ** usarse para contraseñas. – rugk

15

Si compara cadenas, use strcmp o ===. La gente prefiere === porque strcmp puede ser confuso (devuelve 0 en caso de éxito, wat).

Debe usar ===, no ==. == convertirá ambos operandos en enteros si se pueden interpretar como tales, y debido a que un hash MD5 no cabe en un entero, se truncarán alrededor de la mitad. Por lo tanto, solo las primeras mitades de los hashes deben ser iguales. Ver http://phpsadness.com/sad/47.

Si usa contraseñas hash, considere usar un algoritmo hash lento y fuerte como PBKDF2, en lugar de MD5.

+4

Guau ... eso es verdaderamente triste. – BoltClock

20

Debe tener mucho cuidado al comparar los hashes directamente para cosas como la autenticación ya que podría estar abriendo una ventana a un ataque de temporización.

Aunque suena muy contradictorio, debería hacer una comparación completa de la cadena, evitando cualquier optimización (es decir, salir temprano si un personaje es diferente).

Éstos son algunos enlaces sobre el problema:

Y aquí están algunas ideas con el fin de solucionarlo:

0

En realidad se debe utilizar para este password_verify y también utilizar todas las demás funciones password_*. Están disponibles en PHP> = 5.5.0.

Como una alternativa, puede usar this polyfill. Actualmente funciona con PHP> = 5.3.7.

Y si realmente no puedes/quieres usar esto todavía hay hash_equals (y polyfills para eso) como @MM. ya dicho.

Cuestiones relacionadas