¿Debo usar if(strcmp(md5($string),$hash)==0)
o if(md5($string)==$hash)
¿Cuál es la mejor manera de comparar cadenas hash? (PHP)
Respuesta
==
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.
¿Cuál tiene mejor rendimiento? – webnat0
==, porque solo una comparsión como mi publicación a continuación dijo –
@ Da9: ... y no hay función de llamada. –
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.
Mirar @MM respuesta. En segundo lugar, md5 está obsoleto (comprobado que puede ser pirateado). Usa sha (una mejor, no la mejor). – Symba
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. –
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
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.
Guau ... eso es verdaderamente triste. – BoltClock
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:
- https://wiki.php.net/rfc/timing_attack
- http://codahale.com/a-lesson-in-timing-attacks/
- http://carlos.bueno.org/2011/10/timing.html
Y aquí están algunas ideas con el fin de solucionarlo:
- El más rápido y fácil: simplemente use
hash_equals()
si está disponible (PHP 5.6 y superior). - https://github.com/symfony/polyfill-php56/blob/master/Php56.php (
hash_equals()
polyfill) - https://github.com/zendframework/zend-crypt/blob/master/src/Utils.php (
compareStrings()
)
Si estás usando nada más nuevo que PHP 5.6 (e incluyendo) se debe utilizar timing attack safe string comparison función.
if (hash_equals($expected, $correct)) {
}
(Si estás en PHP 5.5 o anterior, see here for equivalents.)
La única respuesta correcta realmente. –
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.
- 1. ¿Cuál es la mejor manera de comparar varias propiedades javabean?
- 2. ¿Cuál es la mejor manera de comparar programas en Windows?
- 3. ¿Cuál es la mejor manera de comparar Double e Int?
- 4. Cuál es la mejor manera de paginar resultados en php
- 5. ¿Cuál es la mejor manera de encriptar una cadena muy corta en PHP?
- 6. ¿Cuál es la mejor manera de comparar dos objetos JavaScript en GWT?
- 7. ¿Cuál es la mejor manera de afirmar la igualdad numpy.array?
- 8. ¿Cuál es la mejor manera de copiar en profundidad un hash de hashes en Perl?
- 9. La mejor manera de comparar 2 documentos XML en .NET
- 10. ¿Cuál es la mejor función hash de 32 bits para cadenas cortas (nombres de etiqueta)?
- 11. ¿La mejor manera de comparar dos listas de cadenas grandes, usando C# y LINQ?
- 12. ¿Cuál es la mejor manera de comparar 2 árboles de carpetas en Windows?
- 13. ¿Cuál es la mejor manera de comparar dos colecciones en Java y actuar sobre ellas?
- 14. ¿Cuál es la mejor manera de comparar las fechas en Perl?
- 15. ¿Cuál es la mejor manera de comparar un valor con "indefinido"?
- 16. ¿La mejor manera en php para encontrar las cadenas más similares?
- 17. ¿Cuál es la mejor manera de proporcionar localización para Enumeraciones?
- 18. Cuál es la mejor manera de convertir un hash de rubí a un array
- 19. ¿Cuál es la mejor manera de separar cadenas utilizando la función string.format() o LINQ?
- 20. ¿Cuál es la mejor manera de hash una url en ruby?
- 21. En Rails, ¿cuál es la mejor manera de compactar un hash en un resumen anidada
- 22. ¿Cuál es la mejor manera de enlazar valores decimales/dobles/flotantes con PDO en PHP?
- 23. Ruby on Rails: ¿la mejor manera de comparar dos fechas?
- 24. ¿Cuál es la mejor manera de centralizar y asegurar las cadenas de conexión?
- 25. ¿Cuál es la mejor manera de borrar una matriz de cadenas?
- 26. ¿Cuál es la mejor manera de generar todas las posibles cadenas de tres letras?
- 27. ¿Cuál es la mejor forma de analizar cadenas?
- 28. ¿Cuál es la mejor manera de encriptar cadenas cortas en .NET?
- 29. ¿Cuál es la mejor manera de probar las cadenas retrayed_job con rSpec?
- 30. ¿Cuál es la mejor manera de almacenar cadenas UTF-8 en memoria en C/C++?
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. –
Para cualquiera que lea este hilo, [es probable que no deba hacer eso ** en absoluto **] (http://phpsadness.com/sad/47). – ereOn
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