Buen algoritmo de hashing de contraseña compatible con aplicaciones PHP y Linux

2

Estoy buscando un método hash de contraseña para un nuevo sistema de servidor. Los hashes deben ser generados a partir de código PHP y verificados desde PHP, así como por una serie de aplicaciones en un sistema Linux.

Sé que MD5 simple y salado y SHA-1 no son una buena solución. He oído que sha256crypt y sha512crypt deberían estar bien hoy. Una vez leí que los algoritmos sha2crypt ahora son muy fáciles de crackear, haciéndolos inútiles. A menudo escucho bcrypt recomendado. Pero también ha habido múltiples problemas con bcrypt por ahora. $ 2 $ ya no parece ser relevante, pero $ 2a $ y $ 2b $ son incompatibles como lo entiendo. Y al menos PHP tiene una comprensión extraña de arreglar cosas al reutilizar el prefijo $ 2a $ para el algoritmo $ 2b $, lo que lo hace incompatible. No sé qué significan $ 2x $ y $ 2y $. PBKDF y scrypt no parecen estar soportados por nada, así que no puedo usarlos.

PHP puede generar hashes bcrypt con la función password_hash , pero no parece ser capaz de crear hashes sha256crypt o sha512crypt, ni con password_hash ni crypt , que decidirá por sí mismo qué algoritmo usar . Quiero especificar el algoritmo porque no todas las aplicaciones admiten ningún algoritmo.

Por ahora, el algoritmo sha512crypt parece más prometedor, considerando primero la compatibilidad y luego la seguridad. (Una cosa súper segura que simplemente no funciona sigue siendo inútil). Pero PHP no puede generar eso. ¿Estoy atascado con crypt() usando SHA-1 nuevamente? (Eso es lo que hace: $ 1 $)

El sistema operativo es Ubuntu 14.04 y las aplicaciones son exim, dovecot y proftpd por ahora. La versión de PHP es 5.5.9.

Entonces, ¿qué debo hacer? Estoy completamente confundido por todos en este momento.

    
pregunta ygoe 20.12.2014 - 16:27
fuente

1 respuesta

2

Realmente no entiendo las limitaciones que tiene con aplicaciones de terceros, pero abordaré la pregunta que hizo.

En lugar de centrarse en "¿en qué algoritmo debería confiar para siempre?", debería hacer que su sistema de hash sea actualizable. SSL se inventó hace 20 años, y uno de los puntos fuertes de SSL fue que los sistemas de cifrado fueron diseñados desde el principio para ser reemplazados a medida que aparecían nuevos ataques. Como hemos visto recientemente, muchas suites de cifrado se han roto y retirado, pero el propio SSL continúa porque fue diseñado para cambiar.

Esto no es terriblemente difícil. Solo necesitas almacenar el algoritmo de hash junto con el hash. Si se descubre una falla en un algoritmo de hash, cambie el algoritmo de hash que usa para las contraseñas nuevas o modificadas, y la próxima vez que un usuario se autentique exitosamente, vuelva a almacenar el hash con el nuevo algoritmo de hashing. Con el tiempo, los usuarios se actualizarán al nuevo hash.

MD5 y SHA1 se consideran rotos y no deben usarse en nuevas implementaciones de hashing. SHA256 y SHA512 son actualmente algoritmos de gran confianza. No estoy seguro de qué problemas tiene para encontrar soporte para ellos en PHP, pero parece que ambos son directamente compatibles con la extensión de criptografía. enlace

De lo contrario, estoy seguro de que puedes encontrar una biblioteca en algún lugar que los admita.

Se recomiendan las otras precauciones estándar. Asegúrese de usar al menos 128 bits de sal generada aleatoriamente para CADA hash almacenado. Podría considerar agregar "pimienta" a, que es una sal única almacenada en un lugar separado de su hash.

    
respondido por el Steve Sether 22.12.2014 - 17:36
fuente

Lea otras preguntas en las etiquetas