Pubblicato il

javascript

nodejs

bcrypt


come criptare e decriptare una password con javascript e nodejs

La crittografia è uno degli strumenti più importanti di oggi nel mondo dell'informatica. Perché è cosi importante? Beh la crittografia viene utilizzata (oltre a tanti altri utilizzi) per nascondere password e dati privati di un utente. Senza la possibilità di criptare un testo o file, sarebbe impossibile dal punto di vista della web security implementare un sistema sicuro e privato. In questa piccola guida andiamo a vedere come sia possibile criptare una password in modo da poterla salvare con sicurezza in un database senza correre il rischio che questa venga letta da un utente esterno. Solitamente la criptazione di un file  o testo viene seguita nel back-end per motivi di sicurezza, ma questo metodo è applicabile anche nel front-end tramite l'utilizzo di Angular o un altro framework JavaScript che permette l'uso di moduli npm nel client code. Vi sconsiglio altamente di criptare file sicuri o privati nel front-end.

Che cos'è il hashing?

In parole semplici, il hashing consiste nel processo di conversione da un valore ad un altro. Per esempio convertire un un numero o oggetto in una rappresentazione sotto forma di stringa. La funzione hash è la funzione che esegue questa conversione. Una buona hash function deve essere a "senso unico" nel senso che una volta ottenuta la conversione non è possibile risalire al valore originale.  In una buona hash function l'unico modo per ottenere il valore originale è tramite un metodo brute force, ma se la funzione hash è abbastanza complicata, eseguire un attacco brute force è praticamente impossibile. 

Che cos'è bcrypt

Bcrypt è un algoritmo per eseguire il hashing di password che è protetto sia da attacchi "rainbow table" che "brute force". Quasi tutti i linguaggi di programmazione moderni hanno una implementazione dell'algoritmo bcrypt sotto forma di librerie esterne. Oggi andremo a vedere come usare bcrypt nel nostro script JavaScript. 

Come installare bcrypt con npm

Come potete indovinare, la libreria che andremo ad usare si chiama proprio bcrypt. Prima di tutto vediamo come installare questa libreria usando npm. Per questo tutorial utilizziamo il sistema di Node.js per eseguire codice JavaScript nel back-end.

npm install bcrypt

Una volta installata la libreria bcrypt vediamo come utilizzarla!

Come codificare una password in JavaScript

Vediamo in basso il codice per criptare la nostra password usando il modulo bcrypt per JavaScript.

const bcrypt = require('bcrypt');
const saltRounds = 10;
const la_mia_password = 'UnaPasswordSegreta';
const altra_pass = 'UnAltraPassword';
bcrypt.genSalt(saltRounds, function(err, salt) {
    bcrypt.hash(la_mia_password, salt, function(err, hash) {                    
        // qui possiamo salvare la nostra password criptata (hash) in un DB     }); });

Come potete vedere dal codice in alto, prima importiamo il modulo bcrypt nel nostro codice JavaScript. Poi generiamo un salt che serve per aggiungere una fattore di randomizzazione al processo di hashing. Una volta generato il salt, possiamo usarlo per criptare la password usando il metodo bcrypt.hash(). Possiamo poi salvare questa password in forma codificata in un database.  

Come decriptare una password in JavaScript con bcrypt

Per decodificare la password è ancora più semplice. Basta utilizzare il metodo bcrypt.compareSync(). Questa funzione prende due argomenti: il primo è la password da controllare e il secondo è la password codificata. Vediamo in basso il codice completo:

const bcrypt = require('bcrypt');
const saltRounds = 10;
const la_mia_password = 'UnaPasswordSegreta';
const altra_pass = 'UnAltraPassword';
bcrypt.genSalt(saltRounds, function(err, salt) {
    bcrypt.hash(la_mia_password, salt, function(err, hash) {
        // qui possiamo salvare la nostra password criptata (hash) in un DB
    });
});
// per decriptare
var hash = Database.getPassword(user); // caricate la password dal vostro database.
bcrypt.compareSync(altra_pass, hash);

Come potete vedere il metodo compareSync restituisce un valore di tipo boolean che poi possiamo inserire all'interno di una condizione IF per verificare se le due password combaciano. Ci siamo! Abbiamo visto come criptare e decriptare una password usando il metodo dell'Hashing con la libreria bcrypt per JavaScript. 

Se hai una domanda puoi chiedere qualsiasi cosa nei commenti in basso

Grazie per aver letto questa guida su Devnews.it

Spero ti sia stata utile in qualche modo. Ti prego di supportare questa pagina mettendo mi piace alle nostre pagine social cliccando un basso, dove pubblichiamo regolermente notizie, tutorial e fatti curiosi sull'informatica. Grazie e ci vediamo alla prossima :)