Desde github :
Para hash una contraseña:
var bcrypt = require('bcrypt');
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash("B4c0/\/", salt, function(err, hash) {
// Store hash in your password DB.
});
});
Para comprobar una contraseña:
// Load hash from your password DB.
bcrypt.compare("B4c0/\/", hash, function(err, res) {
// res == true
});
bcrypt.compare("not_bacon", hash, function(err, res) {
// res = false
});
Desde arriba, ¿cómo puede no haber valores de sal involucrados en las comparaciones? ¿Que me estoy perdiendo aqui?
column_password = hash, column_salt = salt
vscolumn_password = hash_salt
. El atacante todavía tiene la misma información. El punto de la sal es hacer que cada contraseña sea tan aleatoria y más grande que sea poco probable que alguien la haya calculado previamente.También tuve la misma pregunta que en el póster original y tuve que mirar un poco a mi alrededor y probar diferentes cosas para entender el mecanismo. Como ya han señalado otros, la sal se concatena al picadillo final. Entonces esto significa un par de cosas:
Estas dos cosas generalmente están codificadas en la implementación, por ejemplo, la fuente de implementación bcrypt para bcryptjs define la longitud de la sal como 16
Entonces, para ilustrar el concepto básico detrás de la idea, si uno quisiera hacerlo manualmente, se vería similar al siguiente. No recomiendo implementar cosas como esta usted mismo cuando hay bibliotecas que puede hacer.
fuente
Como yo mismo tenía la misma pregunta, sé exactamente en qué estás pensando.
Tiene una idea errónea entre "Clave secreta" que se usa en algoritmos criptográficos y "Salt" que se usa para ralentizar el proceso de cifrado y dificultar el uso de la fuerza bruta por parte de los piratas informáticos.
Cuando usa la contraseña simple y la sal para generar el hash, ¡este hash usa como clave secreta la contraseña misma ! Entonces, la próxima vez que intente compararla con una contraseña simple, ¡esta contraseña simple debe ser exactamente la misma que utilizó para generar el hash! Así que esta es la razón por la que no tiene que almacenarlo en otro lugar porque el usuario siempre lo proporciona tanto en los pasos de registro como de inicio de sesión.
fuente