2013-01-09 17 views
5

Sto usando pbkdf2 in node.js per le password di hashing.crypto.pbkdf2 è asincrono, come lo tratto come sincrono?

Il mio problema è che sto rispondendo a una richiesta di autenticazione e sono nel mezzo dell'autenticazione se le credenziali passate sono corrette. Presumo che pbkdf2 sia asincrono in quanto potrebbe richiedere molto tempo (a seconda della dimensione delle iterazioni). Tuttavia, spostare la restante logica di autenticazione in un metodo separato per utilizzare il callback sembra un po 'brutto.

Esiste un approccio migliore rispetto all'utilizzo di un timer o al lancio di tutta la logica di autenticazione consecutiva in una funzione separata? So che la maggior parte dirà che dovrei usare il callback, ma nel mio caso d'uso questo non ha senso. Non riesco a continuare l'autenticazione fino a quando non ho applicato pbkdf2 alla password passata.

risposta

4

Posso vedere due soluzioni per il tuo problema.

Il primo consiste nell'utilizzare alcune librerie per racchiudere le chiamate asincrone. Si può provare node-sync o node-promise. node-sync è più adatto per quello che vuoi.

Seconda soluzione è quella di utilizzare bcrypt invece di crypto:

var bcrypt = require('bcrypt'); 
var salt = bcrypt.genSaltSync(10); 
var hash = bcrypt.hashSync(password, salt); 

bcrypt è una libreria speciale per l'hashing delle password in nodo. È più sicuro del modulo di crittografia incorporato e fornisce alcuni metodi utili come hashSync e compareSync.

+0

Ho ragione nel presumere che il bcrypt sia basato su blowfish (come per il collegamento wikipedia dal progetto node.bcrypt.js)? Stavo usando pbkdf2 con un sale più grande di 128 bit e con 10000 iterazioni, che afaict è approvato dal NIST, mentre il blowfish bcrypt non lo è (vedi wikipedia artical). Sono solo curioso di sapere che bcrypt è più sicuro. Per i miei scopi è molto probabile. non così importante, ma mi piacerebbe usare l'approccio più sicuro. – Metalskin

+0

@Metalskin, ho studiato un po 'di più. 'Bcrypt' è più forte su pathipres più brevi, ma inizia a perdere' pbkdf2' su pathfrases più lunghi di 55 caratteri. Ma entrambi sono abbastanza sicuri, quindi non c'è una vera differenza. Vedi [questa risposta] (http://stackoverflow.com/questions/4433216/password-encryption-pbkdf-using-sha512-x-1000-vs-bcrypt) per maggiori informazioni. –

+0

Grazie a questo link è stato davvero utile, non penso che avrò più di 55 caratteri quindi dovrebbe essere ok usare bcrypt. Sembra che lo scrypt sia migliore ma non sono riuscito a trovare alcun progetto attivo per node.js. – Metalskin

5

In base allo Node.js crypto docs, esiste una versione asincrona e sincrona della funzione PBKDF2.

crypto.pbkdf2 (password, sale, iterazioni, keylen, callback)

Asynchronous PBKDF2 permangono funzione pseudocasuale HMAC-SHA1 per derivare una chiave di lunghezza determinata dalla password proposta, sale e iterazioni . Il callback riceve due argomenti (err, derivedKey).

crypto.pbkdf2Sync (password, sale, iterazioni, keylen)

funzione PBKDF2 sincrono. Restituisce derivatoKey o genera errore.

+1

Grazie Kevin, non sono sicuro del motivo per cui non l'ho visto l'anno scorso. Se funziona, allora è una risposta migliore in quanto è ciò che volevo davvero. Quando avrò la possibilità di rivisitare il codice e testare. – Metalskin

Problemi correlati