Реализация 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
в нашем случае последствия для безопасности использования более слабого алгоритма для хэширования паролей были приемлемыми.