криптографический.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 или выдает ошибку.