usando sha256 como hashing y salazón con la identificación del usuario

Voy a usar sha256 para mi sitio, para proteger las contraseñas de mis usuarios, y como sal que estaba pensando en utilizar el ID de los usuarios (int auto_increment). eso será único pero no muy largo y difícil, y público (user.php? id = 1) pero solo importa si es su único derecho?

hash('sha256', $id . $password); 

Sí, es importante que la sal sea única (las colisiones son lo suficientemente improbables), pero también debe tener suficiente entropía (sea al azar y lo suficientemente larga). Los ID de usuario no son aleatorios y pueden ser demasiado cortos, por lo que la mejor opción es usar cadenas generadas aleatoriamente y almacenarlas en su base de datos junto con el hash.

Supongamos que un usuario con UID 9 elige una contraseña estúpida: password . La cadena resultante que será hash puede ser entonces 9password . Puede imaginarse que incluso en este caso, la cadena completa puede aparecer en tablas de arcoiris (tablas que contienen montones y montones de hashes con su cadena original).

Si la sal en este caso sería, por ejemplo, OTAzMzYzODQzMjk5NTM1NDc1N , la cadena que se va a aplicar hash es OTAzMzYzODQzMjk5NTM1NDc1Npassword , que es mucho más improbable que aparezca en tablas de arcoíris. Además, las cadenas de entrada son mucho más largas, lo que reduce el riesgo de ataques de fuerza bruta.

Esto funcionaría, pero el propósito de usar sal es diferenciar la clave hash para fortalecer el algoritmo de la cripta. Sería mucho mejor usar una cadena de sal única, sacada del tiempo y generada al azar. También sería mejor no incluir la clave de sal y hash en la misma tabla.

Tu sal no debe ser fácil de adivinar. En una de sus formas más básicas, puedes simplemente crear una sal basada en el TIMESTAMP actual usando

  date('U') 

que es mucho más seguro debido a su longitud, singularidad y al hecho de que lo almacena en la BD y no lo pone a disposición del público. Entonces lo utilizarías de tal manera:

 $hash = date('U'); $pass = hash('sha256', $hash . $password); 

y en cuanto a verificar contraseñas al iniciar sesión:

 // return query object based on matching email/username if ($userobj->pass === hash('sha256', $userobj->salt .$_POST['pass'])) { // correct pass } 

No creo que sea una buena opción: usaría una sal más aleatoria guardándola en el registro del usuario. Tal vez guardando en el campo de contraseña esta cadena: sha256 ($ password. $ RandomSalt). ps $ randomSalt

De esta forma, puede recuperar la sal para verificar el passoword al iniciar sesión.

(De todos modos, también puedes usar otro campo solo para la sal)