криптографический.pbkdf2 является асинхронным, как я могу рассматривать его как синхронный?

Я использую pbkdf2 в узле.js для хэширования паролей.

моя проблема в том, что я отвечаю на запрос Аутентификации, и я нахожусь в середине аутентификации, если переданные учетные данные верны. Я предполагаю, что pbkdf2 является асинхронным, поскольку это может занять большое количество времени (в зависимости от размера итераций). Однако перемещение оставшейся логики аутентификации в отдельный метод для использования обратного вызова кажется немного уродливым.

есть лучший подход, чем использование таймера или выбрасывание всей последовательной логики аутентификации в отдельную функцию? Я знаю, что большинство скажет, что я должен использовать обратный вызов, но в моем случае это просто не имеет смысла. Я не могу продолжить аутентификацию, пока не применю pbkdf2 к переданному паролю.

2 ответов


Я вижу два решения вашей проблемы.

сначала нужно использовать некоторую библиотеку для переноса асинхронных вызовов. Вы можете попробовать узел синхронизации или узел-обещаю. node-sync лучше подходит для того, что вы хотите.

второе решение-использовать bcrypt вместо crypto:

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

bcrypt специальная библиотека для хэширования паролей в узел. Это более безопасно, чем встроенный крипто-модуль и предоставляет некоторые полезные методы как hashSync и compareSync.


по словам узел.JS crypto docs, существует как асинхронная, так и синхронная версия функции PBKDF2.

крипто.pbkdf2 (пароль, соль, итерации, кейлен, обратный вызов)

асинхронный PBKDF2 применяет псевдослучайную функцию HMAC-SHA1 для получения ключ заданной длины из заданного пароля, соли и итераций. Обратный вызов получает два аргумента (err, derivedKey).

крипто.pbkdf2Sync (пароль, соль, итерации, кейлен)

функция синхронного стандарт PBKDF2. Возвращает derivedKey или выдает ошибку.