Реализация JS Django pbkdf2 sha256

у меня есть база данных от django, и я хочу работать с ней из узла.js. У меня есть задача: аутентифицировать пользователей. Известно из базы данных: алгоритм pbkdf2_sha256, salt, 10000 итераций и base64-кодированный хэш. Какие шаги я должен сделать в JS, чтобы кодировать некоторый пароль для данного base64-хэша?

UPD: нашел решение здесь: python (django) hashlib vs NodeJS crypto но генерируемый Django хэш и генерируемый JS хэш не совпадают...
Django генерировать следующий:

pbkdf2_sha256000$NmzpPCQiTe2R$U8ipSsOy3Xz7FwWDHdH/dTei8Xh4Q7NGtdzrCacSfvo=

JS:

pbkdf2_sha256000$NmzpPCQiTe2R$w4jCgWjDilrDmcOBd8K+I8OdwpkKwoVQZMKWH3FvYcKoAMKcwqlewobDocOEGMKZfQ==

пароль: Simple123

3 ответов


С помощью PBKDF2 с-SHA256 на (из вашей собственной ссылки) я могу создать хэш, идентичный тому, который у вас есть от Django.

var pbkdf2 = require('pbkdf2-sha256');
var validatePassword = function (key, string) {
    var parts = string.split('$');
    var iterations = parts[1];
    var salt = parts[2];
    return pbkdf2(key, new Buffer(salt), iterations, 32).toString('base64') === parts[3];
};
var djangoPass = 'pbkdf2_sha256000$NmzpPCQiTe2R$U8ipSsOy3Xz7FwWDHdH/dTei8Xh4Q7NGtdzrCacSfvo=';
console.log(validatePassword('Simple123', djangoPass)); // Logs: true

вышеуказанного кода должно быть достаточно для проверки паролей, хранящихся в Django с помощью Node.


Я недавно создал проект, чтобы сделать это проще. Мой проект доступен для node и называется node-django-hashers. Код ниже:

https://github.com/kalvish21/hashers

пример использования:

var hashers = require('node-django-hashers');

var h = new hashers.PBKDF2PasswordHasher();
var hash1 = h.encode("password", h.salt());
console.log(h.verify("password", hash1)); // returns true
console.log(h.verify("wrong_password", hash1)); // returns false

это совместимо с хэшированием паролей django.


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

как описано в документация Django вы можете изменить порядок, в котором PASSWORD_HASHERS определены в settings.py, я положил это hasher в первая позиция:

'django.contrib.auth.hashers.SHA1PasswordHasher'

таким образом, хэш пароля, хранящийся в базе данных Django, выглядит примерно так:

sha1$upSZarr0w7CZ4b22b1a9e7e5387e79f50e691043d3faf83c48

если у вас уже есть некоторые пароли в базе данных, они будут автоматически преобразованы в Django при первом логине пользователя.

вы можете легко токенизировать хэш, используя $ как разделитель; первый токен всегда sha1 (используемый алгоритм), второй токен -соль и последний маркер фактический хэш.

чтобы соответствовать паролю, вы можете проверить, что

304b22b1a9e7e5387e79f50e691043d3faf83c48

является SHA1 сумма соль объединено с ожидаемым паролем:

SHA1(upSZarr0w7CZ + password) = 304b22b1a9e7e5387e79f50e691043d3faf83c48

в нашем случае последствия для безопасности использования более слабого алгоритма для хэширования паролей были приемлемыми.