На странице документации PHP говорится, что password_hash() возвращает алгоритм, стоимость и соль как часть возвращаемого хэша. Я предполагаю, что стоимость подразумевает максимальное время для выполнения сравнения, так что password_verify() может возвращать постоянное время, несмотря на количество совпадений. Так ли это?
Нет. password_verify
нужно будет повторить тот же хеш, что и password_hash
, и для этого ему нужно использовать те же параметры, что и password_hash
, использованные для создания хэша. Все эти параметры встроены в хеш, и стоимость является одним из этих параметров. Стоимость определяет, насколько медленным должен быть хэш, обычно путем повторения хеширования, но точное значение может различаться в зависимости от разных алгоритмов хеширования.
password_verify
также сравнивает два хэша в постоянное время, чтобы избежать атак по времени; возможно, это то, с чем вы спутали это понятие. Обычно при сравнении двух строк на равенство вы можете прекратить сравнение, как только обнаружите разницу. Этот мая дает злоумышленнику некоторую информацию, пробуя разные пароли и просматривая разное время, необходимое для сравнения их хэшей. Сравнение с постоянным временем гарантирует, что всегда сравнивается вся строка, каждый раз затрачивая одинаковое количество времени.
password_verify
возвращается в так называемое постоянное время длины, что делает его невосприимчивым к временным атакам.
Атаки по времени в открытом Интернете сложны, если не невозможны, из-за большой естественной изменчивости времени запроса. Локальные сети и общие центры обработки данных более уязвимы. Даже тогда это должна быть довольно целенаправленная атака, и приличный ограничитель скорости предотвратит большинство из них.