Pesquisar este blog

terça-feira, 5 de outubro de 2021

Usando crypto

 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:


var url = "mongodb://localhost:27017/";
Crie a string conexão com o banco junto com a instrução de criação de login:

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;
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();
  });
});
Legal então...