Comunidad de diseño web y desarrollo en internet online

Cifrar contraseña en login con Node.js

Cuando trabajamos sobre un sistema de usuarios lo primero que debemos pensar es en la seguridad de los datos, con crypto, el módulo de Node.js, podemos hacer un hash personalizado para poner un poco de seguridad a la contraseña cifrándola.

Vamos a usar una base de datos MongoDB por medio de Node.js con Mongoose, una librería que trabaja con Node.js para modelar los objetos y consultar a la base de datos.

Primero creamos el proyecto con express en la consola:

Código :

express ejemplo_encriptar


Ahora vamos al archivo app.js y lo primero que debemos hacer es crear la conexión con MongoDB y crear la Schema del usuario:

Código :

var mongoose = require('mongoose');

//nos conectamos a la base de datos 'login'
mongoose.connect('mongodb://localhost/login')
//obtenemos la conexión
var db = mongoose.connection

//usamos el método Schema
var Schema = mongoose.Schema
//creamos la Schema, muy sencilla sólo usaremos los campos username y password
var usuario_schema = new Schema({
   username   : String,
   password    : String,
})
//declaramos el objecto User para poder utilizarlo en las rutas
var User = db.model('User', usuario_schema)


Seguido esto creamos con Jade o HTML el formulario, donde manejaremos el login y el registro:

Código :

<form method='post' action="registrar">
   <input type="text" name='username'>
   <input type="password" name='password'>
   <input type="submit" value='Registrar'>
</form>

<form method='post' action="login">
   <input type="text" name='username'>
   <input type="password" name='password'>
   <input type="submit" value='Login'>
</form>


y creamos las rutas POST configurando el archivo app.js:

Código :

app.post('/registrar', function(req, res) {
   //Obtenemos los datos username y password
   var username = req.body.username
   var password = req.body.password
   //Encriptamos por medio de una función la contraseña 
   var passEncriptada = encriptar(username, password)
   //Buscamos si el usuario existe
   User.findOne({username:username},function(err, user){
      if(!user) {
         var user = new User({
            username : username,
            password : passEncriptada
         })
        //guardamos el usuario
         user.save()
         res.send(user)
      }
      else
         res.send('existe')
   })
})

Aquí esta la función que usamos para encriptar, si quieren leer más pueden hacerlo en Crypto:

Código :

function encriptar(user, pass) {
   var crypto = require('crypto')
   // usamos el metodo CreateHmac y le pasamos el parametro user y actualizamos el hash con la password
   var hmac = crypto.createHmac('sha1', user).update(pass).digest('hex')
   return hmac
}

HMAC en sus siglas en inglés Hash-based message authentication code, es una construcción de código que calcula un hash para autenticar alguna información, en este caso Crypto provee como parámetro un string para personalizar nuestro hash.

Ahora la ruta del login, muy parecida a la de registro:

Código :

app.post('/login', function(req, res) {
   var username = req.body.username
   var password = req.body.password

   var passEncriptada = encriptar(username,password)

   User.findOne({username:username},function (err, user){
      if(user){
    //comprabamos si la contraseña encriptada es igual a la contraseña encriptada anteriormente
         if(user.password === passEncriptada)
            res.send('login completado')
         else
            res.send('contraseña incorrecta')
      }
      else
         res.send('no existe')
   })
})


Es la manera más sencilla que encuentro para cifrar con Node.js nuestras contraseñas en cualquier aplicación hecha en Node.js.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

El autor de este artículo ha cerrado los comentarios. Si tienes preguntas o comentarios, puedes hacerlos en el foro

Entra al foro y participa en la discusión

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate