Tengo que reconstruir un proyecto de Ruby on Rails a Node.js. Bcrypt se usó para cifrar contraseñas en el proyecto Ruby y estoy tratando de reconstruir el mismo hash para poder copiar la contraseña codificada y los usuarios pueden iniciar sesión con las mismas credenciales en la versión del nodo.
Este hash $2a$11$j2IA8cPRFFC4YOXTl5kb9eF02fwNdLyFAPOvflQ3h/QdX8mE1SNK2 se usa para la contraseña Test1234 . Revisé el código de Ruby on Rails y vi la siguiente función para codificar una contraseña
Información general
COST = 11 SALT = 1234567890crear hash
def password_hash(password) pwd = "#{password}#{SALT}" ::BCrypt::Password.create(pwd, cost: COST) end¿Coinciden las contraseñas?
def password_match?(password = nil) password ||= @params[:password] encrypted_password = get_encrypted_password return false if !encrypted_password || encrypted_password.size < 8 pwd = "#{password}#{SALT}" BCrypt::Password.new(encrypted_password) == pwd end def get_encrypted_password return unless @account @account.encrypted_password end Por lo que sé algo sobre Ruby, esto significa que en la función password_match , pwd sería Test12341234567890 y BCrypt::Password.new($2a$11$j2IA8cPRFFC4YOXTl5kb9eF02fwNdLyFAPOvflQ3h/QdX8mE1SNK2) comprueba si Test12341234567890 (pwd) .
Cuando uso un verificador de Bcrypt en línea como https://bcrypt.online/ e ingreso el hash junto con el valor de pwd, no obtengo una coincidencia.
También traté de usar el método bcrypt.compare en el paquete de Javascript, pero tampoco funcionó.
¿Qué me estoy perdiendo?
Entonces hicimos un oopsie y resolvimos este problema en los comentarios. Aquí hay un resumen de todo como respuesta.
Yo:
Probé su función password_hash con "Test1234" y la sal que proporcionó. Obtuve $2a$11$bhdYASCaEPv/0HXv3OFtIupv8CgHFoEWkMonShKnNN1fkmRIg.07S como resultado, lo ejecuté a través del verificador en línea que vinculó y obtuve "El hash proporcionado coincide con el texto sin formato proporcionado".
BCrypt::Password.new(password_hash("Test1234")) == "Test12341234567890" También funciona bien y devuelve verdadero.
También probé Node.js con bcryptjs e hice bcrypt.compareSync('Test12341234567890', "$2a$11$bhdYASCaEPv/0HXv3OFtIupv8CgHFoEWkMonShKnNN1fkmRIg.07S"). También funciona bien y devuelve verdadero.
Thor:
Sí, ese es un nuevo hash que creaste con los mismos métodos. Pero por alguna razón, el hash ya creado $2a$11$j2IA8cPRFFC4YOXTl5kb9eF02fwNdLyFAPOvflQ3h/QdX8mE1SNK2 para la contraseña Test1234 que actualmente está almacenado en la base de datos no pasa la prueba de verificación en línea y la prueba compareSync en node.js
Yo:
Eso debería darle la idea de que el problema no está en la función de creación de hash de Ruby, ni en la función de prueba de hash de Node, sino en otro lugar (que técnicamente está fuera del alcance de esta pregunta). Tal vez su base de datos no almacene el hash completo por alguna razón, o lo almacene de manera incorrecta. Tal vez algo en algún lugar elimina o escapa algunos caracteres en el hash, dejándote con uno incompleto. Quizá algo de lo anterior le suceda a la sal. Tal vez el hash en la base de datos fue generado por una función hash diferente o más antigua. Tal vez la sal ha cambiado.
Thor:
¡Gracias por el comentario! Con su comentario descubrí que usaron una sal diferente a la que está dentro del archivo .env. Se almacenó en las variables de configuración de Heroku. ¡Todo está funcionando ahora!