Всем привет. Подскажите как работает функция password_hash. А точнее почему, вводя один и тот же пароль, я всегда получаю разный хеш? И уж тем более не понятно, как php проверяет функцией password_verify, пароль, если хеши для него всегда разные?
Берет пароль. Генерит к нему случайную соль. Выбирает алгоритм хэширования (по умолчанию, раз вы ничего не задали).
Выдает строку, в которой склеены метка алгоритма хэширования, соль и получившийся хэш.
Для проверки достаточно иметь пароль - и разделить эту самую строку на информацию, которая позволяет однозначно его проверить.
Adamos,
1) Если строка сначала хешируется с солью, а потом записываться в виде СОЛЬ+ХЕШ то в чем вообще смысл соли? Ведь злоумышленник получив данные получит и её.
Если я верно понимаю предназначение соли, то она нужна для того что-бы сделать перебор хешей невозможным при условии ято злоумышленник не знает соль, но тут она прямо рядом с хешем пишется. Такой подход разве что против радужных таблиц сработает.
2) Если строка хешируется с солью, но при этом соль никуда не записывается то как password_verify её узнает?
Vocler, сервер всегда имеет всю необходимую информацию для создания хэша, кроме пароля.
Так что взломщики получат соль, и никакой "невозможности" в переборе хэшей нет и не будет.
Фишка в том, что если соли нет или используется общая соль для всех паролей, достаточно составить радужные таблицы один раз и сверить их с базой.
Индивидуальная соль для каждого пароля вынудит взломщика составлять радужные таблицы заново для каждой строчки в базе. А это уже гарантировано нерентабельно.
Если, конечно, в этой строчке не зашифрован доступ банковского админа... Но там безопасность обеспечивают другими методами.