Вопрос или проблема
С ростом популярности Fido2 мы видим все больше доступных аппаратных ключей безопасности Fido2 на рынке.
Можно ли использовать эти токены также для установления общего секрета между двумя токенами?
Я хотел бы использовать их для выполнения чего-то подобного ECDH. Но, насколько мне известно, они поддерживают только операции ECDSA/DSA?
Креативные решения и хacks приветствуются 😀
Нет, вы не можете использовать два ключа FIDO2 для выполнения согласования ключей с помощью ECDH.
Причина в том, что ECDH требует, чтобы открытый ключ другой стороны умножался на секретный скаляр нашей стороны, но протокол FIDO2 не предоставляет никаких средств для выполнения этой операции. Он знает только, как выполнять подписи ECDSA сообщения, что включает хеширование этого сообщения с помощью SHA-256, операции, которая отсутствует в ECDH.
Есть также причины, почему это не было бы хорошей идеей, даже если бы это было возможно. В общем, не рекомендуется использовать один и тот же ключ для нескольких целей, так как это иногда может приводить к интересным атакам, особенно когда одна сторона может действовать как оракул (то есть будет подписывать или расшифровывать некоторый набор сообщений, предоставленный атакующим). Кроме того, в большинстве современных протоколов мы хотим, чтобы наши ключи ECDH имели короткий срок действия, чтобы мы могли гарантировать идеальную прямую секретность, что обычно подразумевает не повторное использование секретной части. Использование аппаратного токена подрывает цель эфемерных ключей ECDH, поэтому мы бы хотели этого избежать.
Не напрямую – как @bk2204 говорит, в FIDO2 нет встроенной поддержки обмена ключами (и хотя многие устройства FIDO2 поддерживают функциональность, выходящую за пределы FIDO2, я не знаю ни одного, которое специально поддерживало бы обмен ключами) – но нет необходимости в прямой поддержке. То, что FIDO2 (или что-то другое, что поддерживает подпись с помощью закрытого ключа) может сделать, это аутентифицировать публичные параметры обмена [EC]DH ключами (подписывая свои / предоставляя публичный ключ для проверки подписи другой стороны). Это решает самую большую уязвимость безопасности в [EC]DH – тот факт, что он неаутентифицирован и, следовательно, по умолчанию уязвим к атаке “человек посередине” – при условии, что у вас есть возможность безопасно распространять/проверять публичные ключи (это можно сделать, например, через x.509 сертификаты, веб доверия и т.д.). Это также позволяет использовать эфемерные ключи, что обеспечивает прямую секретность и решает еще одну серьезную угрозу для онлайн-обменов ключами. Использованный таким образом, токен FIDO2 действует как HSM для безопасного установления эфемерного общего секрета по запросу.
Процесс выглядит примерно так, в целом (Важное предупреждение: Я не криптограф и мог допустить ошибки; всегда получайте сторонний обзор перед реализацией нового протокола):
- “Зарегистрируйте” контрагент (это может быть конкретное лицо/учетная запись/устройство или произвольный сервис) с помощью FIDO2. Это генерирует уникальную пару открытого/закрытого ключа, связанную с этим контрагентом. Если это уместно, подпишите открытый ключ или обеспечьте его подпись (например, поместив его в сертификат, подпись которого требует, чтобы CA подписал его для получения сертификата), чтобы можно было проверить ваше право собственности на него.
- Распространите/получите открытый ключ (опционально в сертификате или иначе подписанном) от/контрагента и проверьте его подлинность. Этот шаг можно выполнить заранее или совместить с шагом #4.
- Когда вы хотите обменяться секретом с контрагентом, сгенерируйте эфемерные параметры [EC]DH в формате, который ожидает контрагент, и подпишите публичный параметр так, как будто это вызов FIDO от контрагента.
- Передайте свой подписанный публичный параметр и получите параметр контрагента. Проверьте подпись на их параметре с помощью аутентифицированного публичного ключа, который у вас есть для них; это аутентифицирует обмен ключами.
- Завершите процесс [EC]DH для генерации эфемерного общего секрета. При условии, что токены FIDO2 ни одной из сторон не были потеряны/скомпрометированы, вы можете в этот момент быть уверены, что обе стороны являются теми, кем они себя называют (в рамках специфики, которую вы имеете о связанной идентичности их публичного ключа), обе стороны имеют один и тот же секрет, и никто другой его не знает (в рамках безопасности каждого устройства и используемых криптографических конструкций).
Ответ или решение
Использование аппаратных токенов FIDO2 для договоренности о ключах: возможности и ограничения
С ростом популярности FIDO2 и увеличением доступности аппаратных ключей безопасности, многие специалисты IT задаются вопросом: можно ли использовать эти токены для установления общего секрета между двумя сторонами, что будет аналогично протоколу обмена ключами ECDH (Elliptic Curve Diffie–Hellman). Давайте более подробно рассмотрим, почему токены FIDO2 не подходят для этой цели и какие альтернативные решения можно рассмотреть.
Ограничения FIDO2 и протокола ECDH
На первый взгляд, FIDO2, как современная технология аутентификации, кажется многообещающим кандидатом для использования в процессах обмена ключами. Однако при более глубоком анализе становится очевидным, что возможности токенов FIDO2 ограничиваются выполнением операций ECDSA (Elliptic Curve Digital Signature Algorithm) без возможности полной реализации протокола обмена ключами ECDH.
-
Отсутствие необходимых операций: Для выполнения ECDH необходимо умножение публичного ключа другой стороны на приватный скаляр. Протокол FIDO2 не предоставляет возможности для выполнения этой операции, что делает невозможным прямое использование токенов для обмена ключами.
-
Безопасность и функции: Использование одного и того же ключа для нескольких целей может привести к возникновению интересных атак, особенно когда одна сторона может действовать как оракул. При использовании токена безопасности FIDO2, важно соблюдать принципы краткосрочного использования ключей, чтобы обеспечить идеальную секретность, что противоречит идее использования неизменного секретного ключа.
Альтернативное решение: аутентификация параметров ECDH
Хотя токены FIDO2 не могут непосредственно выполнять обмен ключами, они могут быть использованы в качестве средства аутентификации при обмене параметрами ECDH. Это решение позволит существенно повысить уровень безопасности за счет минимизации уязвимостей, связанных с MitM (атаки "человек посередине").
Процесс аутентификации
-
Регистрация контрагента: На начальном этапе необходимо зарегистрировать контрагента (это может быть отдельное лицо, устройство или служба). В процессе регистрации создается уникальная пара публичный/приватный ключи, которые связываются с контрагентом.
-
Дистрибуция и проверка публичных ключей: Публичный ключ может быть передан, например, в виде сертификата, подписанного удостоверяющим центром (CA), что гарантирует его подлинность. Этот шаг важен для защиты от подмены ключей.
-
Генерация переходных параметров: Когда возникает необходимость обмена секретом, обе стороны могут сгенерировать временные параметры ECDH и подписать их, действуя как вызов от контрагента.
-
Передача и аутентификация параметров: Подписанные публичные параметры передаются друг другу. Каждая сторона должна проверить подписание параметров другой стороны с использованием заранее известного публичного ключа. Это этап крайне важен, так как он аутентифицирует процесс обмена ключами.
-
Заключение ECDH: После успешной аутентификации обе стороны могут завершить процесс ECDH для генерации общего секрета. В результате, они гарантируют, что ни одна третья сторона не может получить доступ к этому секрету.
Заключение
Таким образом, хотя токены FIDO2 не могут быть использованы непосредственно для ключевого обмена, их возможности аутентификации обеспечивают безопасный способ установления общего секрета через ECDH. Это решение позволяет избежать большинства уязвимостей, связанных с MitM-атаками и создает основы для безопасного взаимодействия между сторонами. Важно помнить, что перед реализацией данной схемы общение с квалифицированными специалистами в области криптографии является необходимым шагом.