Проверка пароля, хэшированного в Django, с помощью BCryptSHA256PasswordHasher в приложении Node.js

Я пытаюсь перенести некоторых пользователей, созданных в приложении Django, в приложение Node.js. Пароли пользователей, созданные в приложении Django, хешируются с помощью хэша BCryptSHA256PasswordHasher, и они хранятся в базе данных PostgreSQL. Я могу получить всю строку пароля из Postgres, где они хранятся в форме:

<algorithm>$<iterations>$<salt>$<hash>.

Что я пытаюсь сделать, так это выяснить, как взять известный пароль (скажем, Password1) и, используя соль из поля в Postgres, получить хешированную строку Node.js, чтобы она соответствовала строке Django. Таким образом я могу аутентифицировать тех пользователей, которые были перенесены.

Я сделал несколько попыток использовать bcrypt и bcryptjs npm для Node.js, но пока мне не повезло.

Рабочий пример с использованием любого из Node.js npm был бы отличным.


person Craig G    schedule 23.09.2015    source источник
comment
Вы проверили исходный код BCryptSHA256PasswordHasher, чтобы проверить точный алгоритм?   -  person GwynBleidD    schedule 23.09.2015
comment
Действительно, я просмотрел исходный код, но я не очень хорошо знаком с Python и его библиотеками, и проблема в том, как добиться того же результата в Node.js.   -  person Craig G    schedule 23.09.2015


Ответы (1)


Мне удалось понять это после изрядного количества проб и ошибок. Это решение:

var crypto = require('crypto'),
    bcrypt = require("bcrypt");

exports.auth = function (password) {
    var preHash = crypto.createHash('sha256').update(password).digest('hex');
    var hash = bcrypt.hashSync(preHash, salt);

    return hash;
}

где параметр соли должен быть, например:

$2a$12$imuoSFEBx8JJh5L9cCDJKO

Единственное, что мне все еще неясно, это первая часть солевой строки «$ 2a $». В моем поле пароля Django это на самом деле «$2b$», что, согласно странице bcrypt в Википедии действителен, но при попытке использовать $2b$ в соли, переданной bcrypt (и bcryptjs тоже), возникает ошибка. Я могу обойти это, но, возможно, просто нужно обновить bcrypt.

person Craig G    schedule 23.09.2015