2013-01-09 7 views
5

Używam pbkdf2 w node.js do mieszania haseł.crypto.pbkdf2 jest asynchroniczny, jak traktować go jako synchroniczny?

Mój problem polega na tym, że odpowiadam na żądanie uwierzytelnienia i jestem w trakcie uwierzytelniania, jeśli podane poświadczenia są poprawne. Przypuszczam, że pbkdf2 jest asynchroniczne, ponieważ może zająć dużo czasu (w zależności od rozmiaru iteracji). Jednak przeniesienie pozostałej logiki uwierzytelniania do osobnej metody w celu wykorzystania wywołania zwrotnego wydaje się trochę brzydkie.

Czy istnieje lepsze podejście niż użycie licznika czasu lub wyrzucenie wszystkich kolejnych logik uwierzytelniania do oddzielnej funkcji? Wiem, że większość powie, że powinienem użyć wywołania zwrotnego, ale w moim przypadku użycia to po prostu nie ma sensu. Nie mogę kontynuować uwierzytelniania, dopóki nie zastosuję pbkdf2 do podanego hasła.

Odpowiedz

4

Widzę dwa rozwiązania twojego problemu.

Najpierw należy użyć biblioteki do zawijania połączeń asynchronicznych. Możesz spróbować node-sync lub node-promise. node-sync jest lepiej dopasowany do tego, co chcesz.

drugie rozwiązanie jest użycie bcrypt zamiast krypto:

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

bcrypt to specjalna biblioteka dla hasła mieszaja w węźle. Jest bezpieczniejszy niż wbudowany moduł kryptograficzny i zapewnia kilka użytecznych metod, takich jak hashSync i compareSync.

+0

Czy mam rację zakładając, że bcrypt oparty jest na blowfish (jak na link wikipedia z projektu node.bcrypt.js)? Używałem pbkdf2 z solą większą niż 128 bitów iz 10000 iteracjami, które afaict ma NIST zatwierdzone, podczas gdy blowing blowfish nie jest (patrz wikipedia artical). Jestem po prostu ciekawy twojego komentarza, że ​​bcrypt jest bezpieczniejszy. Dla moich celów jest to najbardziej prawdopodobne. nie tak krytyczne, ale chciałbym użyć najbezpieczniejszego podejścia. – Metalskin

+0

@metalskin, zbadałem trochę więcej. 'Bcrypt' jest silniejszy na krótszych ścieżkach, ale zaczyna tracić na' pbkdf2' na frazach o długości powyżej 55 znaków. Oba są jednak wystarczająco bezpieczne, więc nie ma prawdziwej różnicy. Aby uzyskać więcej informacji, zobacz [tę odpowiedź] (http://stackoverflow.com/questions/4433216/password-encryption-pbkdf2-using-sha512-x-1000-vs-bcrypt). –

+0

Dziękuję, że ten link był naprawdę pomocny, nie sądzę, że przekroczę 55 znaków, więc powinno być w porządku korzystanie z bcrypt. Wygląda na to, że lepiej byłoby scrypt, ale nie mogłem znaleźć żadnych aktywnych projektów dla node.js. – Metalskin

5

Zgodnie z Node.js crypto docs, dostępna jest zarówno asynchroniczna, jak i synchroniczna wersja funkcji PBKDF2.

crypto.pbkdf2 (hasło, sól, iteracje, keylen, callback)

Asynchronous PBKDF2 dotyczy funkcji pseudolosowego HMAC-SHA1 czerpać kluczowym z danej długości z danym hasłem, solą i iteracji . Callback otrzymuje dwa argumenty: (err, derivedKey).

crypto.pbkdf2Sync (hasło, sól, iteracji keylen)

synchroniczny funkcyjne PBKDF2. Zwraca wartość pochodnąKey lub podaje błąd.

+1

Dzięki Kevin, nie jestem pewien, dlaczego nie widziałem tego w zeszłym roku. Jeśli to działa, to jest lepsza odpowiedź, bo tak naprawdę chciałem. Kiedy dostanę szansę, powrócę do sprawdzenia kodu i testu. – Metalskin

Powiązane problemy