Как я должен хэшировать пароли перед публикацией, а затем использовать 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 никогда не делайте этого на стороне клиента, потому что они будут запутывать ваш код, в любом случае, видеть ваш алгоритм шифрования.
Любые манипуляции с данными, которые должны иметь место для хранения в базе данных, не должны выполняться на стороне клиента. Также,
- Ваш алгоритм хеширования будет виден
- Хеширование на стороне клиента потребует значительных ресурсов. Например, предположим, что вы хэшируете пароль для 1k одновременно работающих пользователей.