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

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

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

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

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

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

4 ответа

Решение

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

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

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

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

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

Если вы хотите, вы можете поиграть с некоторой реализацией bcrypt на стороне клиента (поиск "bcrypt js", есть пример реализации).

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

Поэтому, если клиент скомпрометирован, значение вашего секретного сервера также подойдет.

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

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

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

Любые манипуляции с данными, которые должны иметь место для хранения в базе данных, не должны выполняться на стороне клиента. Также,

  1. Ваш алгоритм хеширования будет виден
  2. Хеширование на стороне клиента потребует значительных ресурсов. Например, предположим, что вы хэшируете пароль для 1k одновременно работающих пользователей.
Другие вопросы по тегам