Проверка без передачи секрета

Один способ устроить такую проверку — протокол «вызов — ответ». Сайт посылает случайное задание, называемое вызовом, а устройство вычисляет ответ с помощью пароля. Сервер проверяет ответ, но сам пароль в вычисления не получает. Это похоже на контрольную, где проверяющий видит решение задачи, а не исходные записи ученика.

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

Что хранится на стороне сайта

Серверу всё же нужна информация для проверки. Это может быть не пароль, а специальное значение, полученное из него при настройке входа. По нему сервер способен проверить ответ, но не должен иметь возможности просто прочитать исходный секрет. Важно, что это зависит от устройства конкретной системы: одна лишь формулировка «пароль не отправляется» ещё не говорит, насколько безопасно устроена проверка.

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