Шифрование PBKDF2-SHA256 в JavaScript

Мне нужно написать простую систему входа для веб-сайта с базой данных MySQL с именами пользователей и паролями, которые используются настольным приложением, написанным на Python.

Настольное приложение использует шифрование PBKDF2-SHA256 (через функцию hashlib.pbkdf2_hmac() в Python) для хеширования паролей с уникальными случайными солями. Из-за этого мне нужно использовать тот же тип шифрования для обработки паролей на веб-сайте, для которого я буду писать код на JavaScript.

Я наткнулся на несколько библиотек JavaScript для bcrypt, но ничего особенного для PBKDF2, кроме NodeJS (и я не хочу использовать всю инфраструктуру приложения только для шифрования). Как я могу обрабатывать шифрование PBKDF2 в JavaScript?


person tjohnson    schedule 18.09.2016    source источник
comment
Я думаю, что реальный вопрос здесь заключается в том, почему вы хэшируете пароли на стороне клиента, а не на стороне сервера? Хешированный пароль на стороне клиента просто становится паролем при отправке на сервер. Вы вообще не получаете никакой безопасности.   -  person Luke Joshua Park    schedule 18.09.2016
comment
@LukePark Я новичок в веб-программировании, поэтому я ни в коем случае не эксперт по безопасности, но не более ли безопасно хэшировать пароли на стороне клиента, чем на стороне сервера, чтобы они не передавались в виде обычного текста между ними?   -  person tjohnson    schedule 18.09.2016
comment
таким образом, вместо того, чтобы отправлять пароль в открытом виде, вы должны хэшировать их, отправлять хешированную версию, но также раскрывать свой алгоритм хеширования пароля, таким образом, не обеспечивая никакого дополнительного уровня защиты.   -  person Jaromanda X    schedule 18.09.2016
comment
Итак, если у меня есть пароли, зашифрованные с помощью PBKDF2 в базе данных на моем веб-сайте, как мне реализовать систему входа в систему на веб-сайте безопасным образом?   -  person tjohnson    schedule 18.09.2016
comment
если вам нужна безопасность, используйте https, а не http   -  person Jaromanda X    schedule 18.09.2016
comment
Нет, потому что хэш становится паролем. Предположим, ваш пароль test123 хэширует на abcdef. Затем ваш клиент отправляет abcdef на сервер. Злоумышленник, который подслушивает, все еще может видеть abcdef, а затем изображать из себя вас, когда захочет. Хеширование используется для защиты паролей на стороне сервера. Вы должны использовать TLS (HTTPS) между клиентом и сервером.   -  person Luke Joshua Park    schedule 18.09.2016
comment
А PBKDF2 — это не шифрование.   -  person Luke Joshua Park    schedule 18.09.2016
comment
Я использую HTTPS на веб-сайте, значит ли это, что можно безопасно отправлять пароль в виде обычного текста? Я не знаю, как бы я реализовал систему входа в систему без хеширования, когда пароли хранятся в базе данных в хешированном виде.   -  person tjohnson    schedule 18.09.2016
comment
Да, просто отправьте его прямо через. В этом весь смысл HTTPS. И вы пересчитываете хэши на стороне сервера и сравниваете их на стороне сервера. Вы должны еще немного прочитать о хешировании паролей для баз данных и т. д.   -  person Luke Joshua Park    schedule 18.09.2016
comment
О, так я отправляю ввод пароля пользователя в PHP-скрипт, который сравнивает хэши на стороне сервера или что-то в этом роде? Теперь это имеет смысл.   -  person tjohnson    schedule 18.09.2016
comment
Да именно так. Тем не менее, используйте PBKDF2. hash_pbkdf2 в PHP.   -  person Luke Joshua Park    schedule 18.09.2016
comment
просто отправьте его прямо через @Luke Park. Не согласен: то, что передается по проводу, будь то TLS или нет, не должно быть паролем в очищенном.   -  person Flint    schedule 18.09.2016
comment
@Flint Но я думал, что ответ на вопрос, который вы предложили в качестве дубликата, согласился с Люком Парком, что шифрование должно выполняться только на стороне сервера?   -  person tjohnson    schedule 18.09.2016
comment
Неа. Работа должна быть выполнена дважды и с использованием двух разных алгоритмов. Хеширование на стороне клиента не позволяет кому-либо (скажем, коллеге-разработчику) получать пароли от людей, просто читая запрос. Конечно, расшифровать хэши все же можно, но, по крайней мере, это не так просто, как print request.body.password   -  person Flint    schedule 18.09.2016
comment
@Flint Есть предложения, что использовать для хеширования на стороне клиента? Я бы хотел что-то простое и быстрое, которое можно хешировать как с помощью JavaScript, так и с PHP. Я думаю просто использовать Base64, так как, хотя он и не очень безопасен, он обеспечивает некоторую кодировку. Использование bcrypt было бы излишним. (security.stackexchange.com/a/93411)   -  person tjohnson    schedule 18.09.2016
comment
security.stackexchange.com/questions/23006/   -  person Flint    schedule 18.09.2016
comment
@Flint Единственное преимущество хэширования на стороне клиента, как вы говорите, не позволяет разработчикам-мошенникам просматривать пароли. Это не совсем приоритет. Отправка паролей через TLS в порядке. И вы не можете расшифровать хэш.   -  person Luke Joshua Park    schedule 18.09.2016
comment
Будь то мошеннические или отладочные запросы, пароли не должны случайно отображаться в виде обычного текста.   -  person Flint    schedule 18.09.2016
comment
@tjohnson: используйте свой собственный рецепт поверх известных стандартов быстрого приготовления.   -  person Flint    schedule 18.09.2016