Almacenar contraseñas de forma segura utilizando PHP5

4

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:

  1. Obtenga la contraseña del usuario
  2. 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
  3. Almacene esa sal en la tabla donde los usuarios y sus contraseñas con hash estarán
  4. "Hashinng"
    • Hash la sal concatenada con contraseña usando el algoritmo SHA512
    • password_hash con bcrypt
  5. 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

    
pregunta Kamil Gosciminski 15.04.2015 - 14:55
fuente

1 respuesta

4

Creo que muchas de sus preguntas (p. ej., SHA-512 vs bcrypt) se responden en la guía vinculada a AviD. Pero en realidad no dice nada sobre PHP, así que responderé esa parte.

Hashing una contraseña en PHP5

Es bueno que quieras entender los conceptos subyacentes, pero en realidad, es muy fácil escribir una contraseña en PHP5 de manera segura:

$hashedPassword = password_hash($plainPassword, PASSWORD_DEFAULT);

Eso es todo . Almacénelo en la base de datos, use password_verify para comparar, y listo. password_hash creará una sal por usuario, por lo que no necesita los pasos 2 o 3 [*]. Tampoco necesita la primera parte de su paso 4 (es suficiente para hacer hash una vez).

El resultado de esto será de la forma $hashFunctionId$options$saltHash . El hashFunctionId y las opciones (el costo) se utilizan para almacenar información sobre cómo se creó el hash.

[*] Puedo ver por qué es confuso, porque muchas guías mencionan explícitamente la importancia de las sales por usuario, por lo que puede parecer extraño que PHP realmente haga el trabajo por ti

opciones de password_hash

Entonces, ¿cuál es el uso de las otras opciones de password_hash si el hashing es así de simple?

PASSWORD_DEFAULT significa que actualmente se utilizará bcrypt, pero si hay mejores métodos en el futuro, se usarán. Si, por algún motivo, desea controlar esto, reemplácelo con PASSWORD_BCRYPT .

Puede pasar una sal que reemplaza la autogeneración de una sal. Esto es útil si desea obtener la misma salida al aplicar la misma contraseña, o si desea incluir un pimiento.

Y puede pasar un costo, si cree que el costo predeterminado de 10 no es suficiente para usted.

    
respondido por el tim 15.04.2015 - 15:57
fuente

Lea otras preguntas en las etiquetas