A cada dia torna-se necessário aumentar a segurança das aplicações.
Neste post demonstro como instalar e usar o crypto, um módulo nativo no Node.js para aumentar a segurança das aplicações.
Nesse exemplo crio um sistema de cadastro de login em um banco de dados MongoDB, entretanto não é recomendável o uso para autenticação múltipla de usuários. Mas podemos tornar o processo mais seguro.
O primeiro passo é criar a pasta do projeto:
No Ubuntu linux rode: mkdir crypto-hoby
O segundo passo é instalar os softwares necessários:
Entre na pasta com ocomando: cd crypto-hoby
Instale o Node ( no Ubuntu linux use: sudo snap install node -- classic).
Inicialize o projeto com npm init -y.
Instale os módulos:
MongoDB: npm install mongodb
Readline-sync: npm install readline-sync
Crie os scritps:Chame os módulos necessários na parte de cima do script:
const readline = require('readline-sync')
const crypto = require('crypto')
var MongoClient = require('mongodb').MongoClient;
Crie as variáveis que irão ser usadas na implementação da instrução :
const username = readline.question('Defina um login: ')
let password = readline.question('Defina uma senha: ')
Crie a instrução para criptografar a senha do usuário:
let salt = 'f844b09ff50c'
let hash = crypto.pbkdf2Sync(password, salt,
1000, 64, `sha512`).toString(`hex`);
password = hash
Crie a url de conexão com o banco de dados:
Crie a string conexão com o banco junto com a instrução de criação de login:
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("cryptohoby");
var myobj = { username: userName, password: passWords };
dbo.collection("login").insertOne(myobj, function(err, res) {
if (err) throw err;
console.log("1 document inserted. Login: "+ userName+ " Senha: "+ passWords);
db.close();
});
});
Também precisa ter o MongoDB instalado.
O scrit inteiro em apenas um arquivo ficaria como abaixo:
const readline = require('readline-sync')
const crypto = require('crypto')
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
let salt = 'f844b09ff50c'
const username = readline.question('Defina um login: ')
let password = readline.question('Defina uma senha: ')
let hash = crypto.pbkdf2Sync(password, salt,
1000, 64, `sha512`).toString(`hex`);
password = hash
const pegarDados = require('./pegarDados')
const userName = pegarDados.username
const passWords = pegarDados.password
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("cryptohoby");
var myobj = { username: userName, password: passWords };
dbo.collection("login").insertOne(myobj, function(err, res) {
if (err) throw err;
console.log("1 document inserted. Login: "+ userName+ " Senha: "+ passWords);
db.close();
});
});
Mas dividi esse script em dois arquivos que estão no meu github:
https://github.com/aondenet-sinval/crypto-hoby
Reforçando:
Se for usar para cadastrar login pode ser melhor usar o bcrypt, pois se um usuário digitar a mesma senha o hash será o mesmo. Confira isso no vídeo abaixo.
Atualizando o post:
Mas podemos tornar o sistema mais volátil e isso pode trazer mais segurança usando o método randomBytes do crypto.
Aí adicionamos a seguinte instrução ao script :
let token = crypto.randomBytes(6).toString('hex');
removemos o salt definido e definimos o salt com o valor randomico:
let salt = token;
Então vejo que melhoramos muito nosso código inicial, pois em caso de ataque de força bruta, agora tornamos a coisa mais difícil ao atacante.
Bom mais você talvez pergunte. E caso eu precise usar a função decipher do crypto.
Podemos contornar usando um salt aleatório e gravando o homônimo gerado no banco de dados.
o meu arquivo do github ficou assim:
var MongoClient = require('mongodb').MongoClient;Legal então...
var url = "mongodb://localhost:27017/";
const pegarDados = require('./pegarDados')
const saltOn = pegarDados.salt
const userName = pegarDados.username
const passWords = pegarDados.password
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("cryptohoby");
var myobj = { salt: saltOn, username: userName, password: passWords };
dbo.collection("login").insertOne(myobj, function(err, res) {
if (err) throw err;
console.log("1 document inserted. Salt: "+ saltOn + ". Login: "+ userName+ ". Senha: "+ passWords);
db.close();
});
});