Есть два стандарта:
1. Международный FIDO2
2. Российский ГОСТ Р 34.10
Работают они по схожей схеме, различается только момент с выпуском сертификатов.
1. Клиент каким-то образом генерирует ключевую пару (закрытый ключ шифрует, открытый расшифровывает).
Тут используется одно из двух: RSA или Эллиптические кривые.
2. Клиент передаёт свой публичный ключ на сервер
При аутентификации:
1. Клиент сообщает, кто он есть
2. Сервер генерирует челендж (просто длинное случайное число, которое определенным критериям отвечает)
3. Клиент шифрует этот челендж своим закрытым ключом
4. Сервер расшифровывает его открытым ключом и сравнивает, что результат получился такой, какой он и сгенерировал изначально.
Таким образом сервер убеждается, что клиент владеет нужным закрытым ключом и аутентифицирует его.