На основе документации nodejs (http://nodejs.org/api/crypto.html), не похоже, что существует определенный метод, который будет проверять пароль для вас. Чтобы проверить его вручную, вам нужно будет вычислить хэш предоставленного в настоящее время пароля и сравнить его с сохраненным паролем на равенство. По сути, вы сделаете то же самое с контрольным паролем, что и с исходным, но используете соль, хранящуюся в базе данных, вместо создания нового, а затем сравните два хэша.
Если вы не слишком привержены использованию встроенной библиотеки шифрования, я могу порекомендовать вместо этого использовать bcrypt. С точки зрения безопасности они примерно равны, но я думаю, что у bcrypt более удобный интерфейс. Пример того, как его использовать (взятый непосредственно из документов bcrypt на странице, указанной выше), будет следующим:
Создайте хэш:
var bcrypt = require('bcrypt');
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync("B4c0/\/", salt);
// Store hash in your password DB.
Чтобы проверить пароль:
// Load hash from your password DB.
bcrypt.compareSync("B4c0/\/", hash); // true
bcrypt.compareSync("not_bacon", hash); // false
Изменить, чтобы добавить:
Еще одним преимуществом bcrypt является то, что вывод функции genSalt содержит и хэш, и соль в одной строке. Это означает, что вы можете хранить в базе данных только один элемент вместо двух. Существует также метод, который будет генерировать соль одновременно с хэшированием, поэтому вам вообще не нужно беспокоиться об управлении солью.
Изменить для обновления:
В ответ на комментарий Питера Лайонса: вы правы на 100%. Я предположил, что модуль bcrypt, который я рекомендовал, был реализацией javascript, и поэтому его асинхронное использование не ускорит работу однопоточной модели узла. Оказывается, это не так; модуль bcrypt использует собственный код C++ для своих вычислений и будет работать быстрее асинхронно. Питер Лайонс прав, сначала следует использовать асинхронную версию метода, а синхронную выбирать только при необходимости. Асинхронный метод может быть таким же медленным, как и синхронный, но синхронный будет всегда медленным.
person
TwentyMiles
schedule
19.06.2013