Как мне хэшировать пароли перед публикацией, а затем использовать BCRYPT?

Я делаю систему входа в систему, и при входе в систему пароль в настоящее время отправляется из JavaScript в файл PHP.

В PHP я использую следующий фрагмент кода для хеширования.

$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);

Как мне хешировать пароль в JavaScript перед его отправкой с помощью POST?

Я явно не хочу влиять на безопасность BCRYPT.

Хеширование на стороне клиента не делает его более безопасным. Используйте HTTPS для связи и используйте хеширование паролей + соление на стороне сервера для хранения паролей.

Dave Chen 29.05.2018 09:28

Сделайте хэш пароля с MySQL, используя SHA1 или SHA2, затем сравните с SHA пароля клиента к базе данных. Используйте SSL для защиты данных, передаваемых по линии.

StackSlave 29.05.2018 09:29

Хеширование паролей в веб-интерфейсе ДОЛЖНО выполняться независимо от использования https. См. Объяснение здесь: stackoverflow.com/a/21716654/43615

Thomas Tempelmann 16.05.2019 16:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
2 900
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Я использую HTTPS, но как вы думаете, мне не следует хешировать его перед отправкой? Это безопасно?

Koen T. 29.05.2018 09:28

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

StackSlave 29.05.2018 09:33

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

scetiner 29.05.2018 09:33

Спасибо за советы!

Koen T. 29.05.2018 09:39

Существует так много непонимания того, как работают хеши и шифрование. Если, конечно, вы не станете шифровать симметричным ключом. Вы бы либо использовали асимметричную технику, когда отправитель, который шифрует данные, имеет только открытый ключ и только сервер с его закрытым ключом, и посмотрите, что было зашифровано. Или, что еще проще, метод хеширования с использованием соли (или одноразового номера) означает, что злоумышленник может видеть хешированное значение, но не может воссоздать из него исходный пароль (в этом суть хеша) и не может повторно использовать тот же хеш, если сервер отправляет одноразовый номер (Google, который)

Thomas Tempelmann 16.05.2019 16:26
Ответ принят как подходящий

То, что делается на стороне клиента, на самом деле не контролируется вами. Я имею в виду, что даже если вы хешируете свой пароль, клиент может получить пароль перед хешированием / шифрованием.

var password = document.getElementById('login').value;
console.info(password); // It is as simple as it
//hash password...

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

Если вы опасаетесь атаки Человек посередине (MITM), самое важное - использовать сертификат TLS с правильным алгоритмом (это зависит от версии OpenSSL вашего сервера). Короче говоря, использование HTTPS - это то, что вы должны делать, чтобы защитить своих клиентов от атаки MITM.

Итак, по мне, перед отправкой паспорта не требуется хешировать / шифровать.

Спасибо, это в точности объясняет мою озабоченность (и насколько я ошибался).

Koen T. 29.05.2018 09:39

Пожалуйста! Иногда сложно понять, что клиентская сторона небезопасна. Есть правило Никогда не доверяйте вводу пользователя, потому что браузер не контролируется вами. Поэтому вам следует закрепить его как можно сильнее, но тогда нельзя быть уверенным в его безопасности.

AnthonyB 29.05.2018 09:43

Если хотите, можете поиграть с какой-нибудь реализацией bcrypt на стороне клиента (ищите "bcrypt js", там пример реализации).

НО, это означает, что вы должны использовать одно и то же значение соли между сервером и клиентом. Этот ответ объясняет.

Следовательно, если клиент скомпрометирован, значение соли вашего секретного сервера также будет.

НО, что ты имеешь в виду? Если вы считаете, что более безопасно отправлять и сравнивать хэш вместо того, чтобы отправлять один раз простой пароль и хешировать его на стороне сервера, вы ошибаетесь. Человек посередине украдет пароль или хеш и нарушит безопасность.

Правильный ответ был дан в комментарии: лучше использовать HTTPS для лучшей безопасности. По крайней мере, используйте дайджест-аутентификацию, если вы не можете использовать протокол HTTPS (Что такое дайджест-аутентификация?)

Другие вопросы по теме