Por qué debe hachís
Todas las contraseñas se deben cifrar antes de entrar en una base de datos porque hay que tener en cuenta el escenario en el que algún usuario malintencionado intente entrar en tus datos. Las contraseñas son información sensible que no quieres que nadie vea.
No confundamos el cifrado con el hash. Cifrar algo supone que más tarde puede ser descifrado. Aunque esto es mejor que dejarlo como texto plano, lo que realmente queremos es algo que no pueda ser desencriptado. Esto es lo que nos ofrece el hashing.
Hashing con Bcrypt
Para este ejemplo vamos a utilizar el más popular bcryptjs para Node.js. Sin embargo, sigue las mismas reglas que otras librerías Bcrypt estándar. Pasas una cadena para ser hash y normalmente también una sal.
Para el ejemplo de bcryptjs harías algo como esto, según la documentación:
1 2 3 4 5 |
var bcrypt = requiere("bcryptjs"); var sal = bcrypt.genSaltSync(10); var hash = bcrypt.hashSync("mi-contraseña", sal); |
El hash resultante no sería legible para el ser humano y, por tanto, seguro de almacenar en una base de datos. Pero, ¿cómo se comparan las contraseñas en el caso de que haya que implementar un inicio de sesión de usuario?
Validación con contraseñas guardadas
Las librerías Bcrypt siempre tienen una función para comparar una contraseña de texto plano contra un hash. Así es como se validaría una contraseña en el escenario de inicio de sesión de usuario.
1 2 3 4 |
bcrypt.compareSync("contraseña incorrecta", hash); bcrypt.compareSync("mi-contraseña", hash); |
Las dos líneas anteriores fueron tomadas de la documentación. En la primera línea, la comparación fallará y devolverá false al usuario. En este caso usted sabe que los valores son erróneos sin siquiera saber cuál es realmente la contraseña hash. En el caso de la segunda línea, las contraseñas coinciden y obtendrá una respuesta verdadera.
Un ejemplo práctico
Hagamos un ejemplo práctico de lo que hemos aprendido arriba. Crear un nuevo directorio en algún lugar y en ella crear un nuevo paquete.json con el siguiente JSON:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "nombre": "ejemplo de intercambio de contraseñas", "version": "1.0.0", "descripción": "Un ejemplo de uso del SDK de Node.js para Couchbase y Bcrypt para hashear contraseñas", "autor": "Couchbase, Inc.", "licencia": "MIT", "dependencias": { "bcryptjs": "^2.3.0", "couchbase": "^2.0.8", "uuid": "^2.0.1" } } |
Las partes importantes son las dependencias. Estamos incluyendo bcryptjs para el hash, couchbase para la comunicación con Couchbase a través de nuestra aplicación, y uuid para generar claves de documento únicas.
Ahora tenemos que crear un nuevo archivo llamado config.json en el directorio de nuestro proyecto e incluye el siguiente JSON:
1 2 3 4 5 6 7 8 |
{ "couchbase": { "servidor": "127.0.0.1:8091", "cubo": "restful-sample" } } |
Deberías cambiar el servidor y el cubo por lo que tengas pensado utilizar.
Ahora viene lo divertido Crea un archivo llamado app.js ya que aquí es donde irá todo nuestro código. Tenga en cuenta que esto es un ejemplo, por lo que la funcionalidad será limitada. Añada el siguiente código JavaScript al archivo app.js file:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var couchbase = requiere("couchbase"); var bcrypt = requiere("bcryptjs"); var uuid = requiere("uuid"); var config = requiere("./config"); var cubo = (nuevo couchbase.Grupo(config.couchbase.servidor)).openBucket(config.couchbase.cubo); var jsonData = { id: uuid.v4(), nombre de usuario: "nraboy", contraseña: bcrypt.hashSync("mi-contraseña", 10) } cubo.insertar("usuario::" + jsonData.id, jsonData, función(error, resultado) { cubo.consiga("usuario::" + jsonData.id, función(error, resultado) { consola.registro("Coincidencia de contraseña -> " + bcrypt.compareSync("contraseña incorrecta", resultado.valor.contraseña)); consola.registro("Coincidencia de contraseña -> " + bcrypt.compareSync("mi-contraseña", resultado.valor.contraseña)); }); }); |
Básicamente estamos creando un documento JSON con una contraseña hash e insertándolo en Couchbase Server. Una vez completada la inserción, obtenemos el documento y comparamos las contraseñas.
Conclusión
Nunca debes almacenar contraseñas en texto plano en tu base de datos. No importa cuán segura sea tu base de datos o qué tipo de base de datos estés usando. Usando el algoritmo hash Bcrypt en tus contraseñas puedes añadir una tremenda cantidad de seguridad para tus usuarios.
En bcryptjs para Node.js es sólo una de las muchas bibliotecas adecuadas que pueden realizar esta tarea.