2014-10-22 15 views
8

Sto cercando una soluzione semplice e sicura per l'archiviazione della password di un utente tramite il nodo. Sono un novizio della crittografia, ma ho cercato di separare una soluzione dalla ricerca online. Sto cercando la convalida che ciò che è venuto fuori è una soluzione solida per un'applicazione web con esigenze di sicurezza di base (non di banca, ospedale, ecc.). Eccolo:Migliori pratiche di crittografia per l'archiviazione della password nel nodo

var crypto = require('crypto'); 
var SALT_LENGTH = 64; 
var KEY_LENGTH = 64; 
var ITERATIONS = 1000; 

function createHashedPassword(plainTextPassword, cb) { 
    crypto.randomBytes(SALT_LENGTH, function (err, salt) { 
     console.time('password-hash'); 
     crypto.pbkdf2(plainTextPassword, salt, ITERATIONS, KEY_LENGTH, function (err, derivedKey) { 
      console.timeEnd('password-hash'); 
      return cb(null, {derivedKey: derivedKey, salt: salt, iterations: ITERATIONS}); 
     }); 
    }); 
}; 

... e qui ci sono le scelte che ho fatto che mi ha portato a questo punto:

Che algoritmo di hash da usare?

In base a this widely referenced article, sembra che i principali contendenti siano PBKDF2, bcrypt e scrypt. Ho scelto PBKDF2 perché ha integrato il supporto nel nodo.

Quale dimensione di sale da utilizzare?

This stack overflow answer sembrava la risposta più semplice che ho trovato. Non sono ancora molto chiaro sul motivo per cui 64 byte è la giusta dimensione del sale però. Quando giro su Google, ottengo altre risposte allo scambio di stack come this, ma non sono sicuro che si applichi all'algoritmo del nodo? Totalmente confuso qui, una spiegazione rivolta ad un principiante che usa questa funzione di nodo sarebbe fantastica.

Quale lunghezza chiave utilizzare?

Ancora una volta, in gran parte ho basato la mia scelta su the same answer as above, ma sono altrettanto noioso sulle basi del "perché". La risposta dice che "è uno spreco generare chiavi più piccole del tuo input, quindi usa almeno 64 byte". Eh? Ancora una volta, una spiegazione pratica sarebbe utile.

Quante iterazioni utilizzare?

Per questa domanda, ho basato la mia scelta su this stack exchange answer. Non ne capisco molto, ma ho capito che l'algoritmo dovrebbe prendere circa 8ms. Quindi, come puoi vedere ho messo i timer sulla funzione, e ho regolato le mie iterazioni per farlo entrare in quello stadio sulla mia macchina.

Grazie!

+0

Quando si tratta di sicurezza, di solito è meglio attenersi al ben noto e librerie ben collaudate. Passport.JS viene in mente e ha plugin che puoi usare per gestire l'hashing. –

+0

Grazie @ Pier-LucGendreau. Sto usando PassportJS, ma non include il codice per l'hashing e la memorizzazione delle password come parte della sua libreria, o dei suoi sotto-moduli. Se mi manca qualcosa, per favore fatemelo sapere. – markdb314

+0

È possibile utilizzare https://github.com/saintedlama/passport-local-mongoose –

risposta

6

Il pacchetto NPM credential gestisce tutti questi

potete vedere scrittura dell'autore su di esso nel libro Programming Javascript Applications

+0

Ho guardato quei collegamenti, e il pacchetto 'credenziali' sembra fare lo stesso tipo di cosa che ho sopra. Nella sua fonte, utilizza una lunghezza salt e una lunghezza della chiave di 66 byte e un valore predefinito di 1000 iterazioni. Nel readme del pacchetto, dice "Il sale dovrebbe avere le stesse dimensioni dell'hash, non più corto e non più". Questa è una buona notizia, ma mi piacerebbe vedere almeno una spiegazione di base del "perché"? – markdb314

+0

@ markdb314 Il "perché" sarebbe probabilmente spiegato meglio da http://security.stackexchange.com/ –

+0

Sì, potrei postare lì ... ma le risposte di solito vanno più nel dettaglio di quanto io possa seguire. Sto solo cercando qualcuno che mi dica con certezza quali costanti usare e un semplice 'perché'. – markdb314

2

consiglio vivamente usando bcrypt. Ci sono molti vantaggi nell'algoritmo e molte implementazioni gestiscono tutte queste domande per te.

Come descritto in this answer:

Bcrypt ha il miglior tipo di fama che può essere raggiunto per un algoritmo di crittografia: è stato intorno per un bel po 'di tempo, utilizzato piuttosto ampiamente, "attirato l'attenzione", e ma rimane ininterrotto fino ad oggi.

ho scritto un articolo dettagliato su come implementare bcrypt nel nodo/esprimere così come altri quadri qui: http://davismj.me/blog/bcrypt