@midia21

Как работает одноразовый пароль на TOTP?

Появилась задача сделать аутентификацию по смс. Для этих целей решил использовать одноразовый пароль на основе времени (TOTP) и PHP библиотеку - Spomky-Labs / otphp. Пока играюсь с ней, чтобы понять суть работы, написал код для тестирования:

$otp = TOTP::create('ggg');
echo $otp->verify($_GET['code']);
echo $otp->now();
echo '
    <form action="index.php" method="GET">
        <input name="code" type="text">
    </form>
';


Есть пару моментов, которые мне не понятны:

1) Каким образом работает алгоритм TOTP? Я праильно понимаю что он берет secret (в данном случае "ggg") и для каждого отрезка времени рассчитывает пароль, что-то вроде:
12 минут 0 секунд - пароль 234567
12 минут 30 секунд - пароль 534234

2) Правильно ли я понимаю, что зная secret можно рассчитать каким будет пароль в какой-то отрезок времени в будущем, например в 16:40

3) И последний третий вопрос. Заметил что пароль меняется независимо от времени запуска скрипта. Если оставить время действия пароля по умолчанию (30 секунд) он будет меняться в 12:30, 13:00, 13:30, 14:00 ....
То есть если пользователь запросит пароль в 13:59 у него будет не 30 секунд на ввод а всего одна секунда. Как с этим можно бороться?

Заранее спасибо.
  • Вопрос задан
  • 477 просмотров
Пригласить эксперта
Ответы на вопрос 2
dark_tke
@dark_tke
Помогли? Отметь решением!
На 1 и 2 вопрос верно

На 3 ответ никак. Если используют одноразовые TOTP пароли подразумевается, что у пользователя стоит мобильное приложение которое ему выдает ключи и показывает время сколько еще этот пароль будет действителен.

Для СМС аутентификации TOTP не лучший вариант

Если нужно понимание алгоритма https://habr.com/ru/post/154229/
Ответ написан
@rPman
То есть если пользователь запросит пароль в 13:59 у него будет не 30 секунд на ввод а всего одна секунда. Как с этим можно бороться?
проверяй не только пароль на текущее время но и на 30 секунд назад, чтобы срабатывал предыдущий, но осторожно, возможны (правда надуманные) случаи, когда время пароля актуально и код из прошлого нельзя допускать..
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы