2013-01-09 30 views
5

Ich benutze pbkdf2 in node.js für Hash-Passwörter.crypto.pbkdf2 ist asynchron, wie behandle ich es als synchron?

Mein Problem ist, dass ich auf eine Anfrage nach Authentifizierung reagiere und ich bin in der Mitte der Authentifizierung, wenn die übergebenen Anmeldeinformationen korrekt sind. Ich nehme an, dass pbkdf2 asynchron ist, da es möglicherweise viel Zeit in Anspruch nehmen kann (abhängig von der Größe der Iterationen). Das Verschieben der verbleibenden Authentifizierungslogik in eine separate Methode zur Verwendung des Rückrufs scheint jedoch etwas hässlich zu sein.

Gibt es einen besseren Ansatz als entweder einen Timer zu verwenden oder die gesamte Authentifizierungslogik in eine separate Funktion zu werfen? Ich weiß, die meisten werden sagen, dass ich den Rückruf verwenden sollte, aber in meinem Anwendungsfall macht das einfach keinen Sinn. Ich kann die Authentifizierung nicht fortsetzen, bis ich pbkdf2 auf das übergebene Passwort angewendet habe.

Antwort

4

Ich kann zwei Lösungen für Ihr Problem sehen.

Die erste besteht darin, eine Bibliothek zu verwenden, um asynchrone Aufrufe zu umbrechen. Sie können versuchen node-sync oder node-promise. node-sync ist besser geeignet für das, was Sie wollen.

zweite Lösung ist bcrypt statt Krypto zu verwenden:

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

bcrypt für Passwort-Hashing in Knoten eine Spezialbibliothek ist. Es ist sicherer als das integrierte Crypto-Modul und bietet einige nützliche Methoden wie hashSync und compareSync.

+0

Bin ich richtig in der Annahme, dass der bcrypt auf Blowfish basiert (wie auf dem Wikipedia-Link aus dem Projekt node.bcrypt.js)? Ich benutzte pbkdf2 mit einem Salz, das größer als 128 Bits und mit 10000 Iterationen war, was eine NIST-Zulassung ist, während der Blowfish bcrypt nicht ist (siehe Wikipedia artical). Ich bin nur neugierig auf Ihren Kommentar, dass bcrypt sicherer ist. Für meine Zwecke ist es am wahrscheinlichsten. nicht so kritisch, aber ich würde gerne den sichersten Ansatz verwenden. – Metalskin

+0

@Metalskin, erforschte ich ein bisschen mehr. 'BCrypt' ist bei kürzeren Pfadphrasen stärker, bei Pfadinfra- sen, die länger als 55 Zeichen sind, beginnt es, auf' pbkdf2' zu verlieren. Aber beide sind sicher genug, also gibt es keinen wirklichen Unterschied. Siehe [diese Antwort] (http://stackoverflow.com/questions/4433216/password-encryption-pbkdf2-using-sha512-x-1000-vs-bcrypt) für weitere Informationen. –

+0

Danke, dass der Link wirklich hilfreich war, ich denke nicht, dass ich über 55 Zeichen gehen werde, also sollte es in Ordnung sein, bcrypt zu verwenden. Sieht so aus, als wäre Scrypt besser, aber ich konnte keine aktiven Projekte für node.js finden. – Metalskin

5

Gemäß der Node.js crypto docs gibt es sowohl eine asynchrone als auch eine synchrone Version der PBKDF2-Funktion.

crypto.pbkdf2 (Passwort, Salz, Iterationen, KEYLEN, Rückruf)

Asynchronous PBKDF2 gilt Pseudo-Zufalls-Funktion HMAC-SHA1 ein Schlüssel bestimmter Länge von der vorgegebenen Passwort, Salz und Iterationen herzuleiten . Der Rückruf erhält zwei Argumente (err, derivedKey).

crypto.pbkdf2Sync (Passwort, Salz, Iterationen, keylen)

Synchron PBKDF2 Funktion. Liefert derivedKey oder löst einen Fehler aus.

+1

Danke Kevin, ich bin mir nicht sicher, warum ich das letztes Jahr nicht gesehen habe. Wenn es funktioniert, dann ist es eine bessere Antwort, da es das ist, was ich eigentlich wollte. Wenn ich eine Chance bekomme, werde ich den Code erneut prüfen und testen. – Metalskin

Verwandte Themen