Nota de inicio: Después de leer algunos artículos y respuestas publicadas en SO relacionados con el almacenamiento de contraseñas seguras, todavía no estoy seguro de si mi forma de pensar es aplicable a la realidad actual.
Actualmente estoy pensando en una manera de proporcionar una estructura segura para almacenar y recuperar las contraseñas necesarias para la autenticación de un usuario en una página web. Mientras exploraba la red y buscaba en las páginas de respuestas, me encontré atascado en algún momento. En primer lugar, el tiempo pasa y no todos los artículos / respuestas están actualizados. En segundo lugar, hay muchas ambigüedades en cuanto a lo que realmente debería hacerse.
Estoy usando PHP5 y la base de datos Postgres. Aunque tengo conocimiento de la existencia del módulo pg_crypto para mí, parece que hacer esos cálculos en el nivel de la base de datos no parece seguro debido al registro y al pasar una contraseña simple a la consulta de la base de datos.
Así que decidí hacer el trabajo en código de aplicación (PHP). Desde PHP5 hay una API de hashing de contraseña nativa que proporciona funciones como password_hash()
y password_verify()
.
Lo que estoy pidiendo es un consejo para saber si estoy o no en el camino correcto o cualquier mejora que se pueda realizar con el apoyo de argumentos sólidos relacionados con la seguridad (por favor, absténgase de asesorar sobre la iteración de millones). veces). Además, ¿es esto posible usar PHP5 o me estoy perdiendo algún conocimiento teórico (considerando mi forma de pensar para este proceso)?
Mi forma de pensar para este proceso es:
- Obtenga la contraseña del usuario
- Aplique una sal generada aleatoriamente para cada usuario (preferiblemente una longitud constante para cada sal), que es independiente de cualquier dato almacenado en la base de datos
- Almacene esa sal en la tabla donde los usuarios y sus contraseñas con hash estarán
- "Hashinng"
- Hash la sal concatenada con contraseña usando el algoritmo SHA512
-
password_hash
con bcrypt
- Almacenar hash en db
Entonces, como puede ver, mi consideración principal es si usar SHA-512 o bcrypto, pero siento que no tengo capacidad en este campo y, por lo tanto, solicito consejos generales para todo mi proceso .
Particularmente, mi atención a qué proceso de "hashing" usar fue llevada por la respuesta de erickson al comparar SHA vs Bcrypt . Soy consciente de la existencia de SHA3, pero ¿eso no prueba que hubo cosas que deberían mejorarse en comparación con la familia SHA2 (esta es una cuestión de tipo por ahora)?
Lo que ya he leído:
Sal no aleatoria para los hashes de contraseña
SHA512 contra Blowfish and Bcrypt
Hash y sal seguros para las contraseñas de PHP
Almacenamiento de contraseñas, hash () con ¿sha-512 o crypt () con pez globo (bcrypt)?
Manual de referencia de PHP - Preguntas frecuentes - Contraseñas