Связывание без аккаунта: как Peering решает, кому доверять
Большинство программ удалённого доступа просят зарегистрироваться, чтобы компания решала, принадлежат ли два устройства друг другу. Peering обходится без компании и спрашивает вас, шестью цифрами.
Каждое устройство само себе личность
При первом запуске на Mac или iPhone Peering создаёт пару ключей P-256 и хранит закрытую часть в Keychain этого устройства. Этот ключ и есть личность устройства навсегда. Нет ни имени пользователя, ни пароля, ни сервера, где хранилась бы копия. При каждом запуске приложение подписывает на этом ключе свежий самоподписанный сертификат, а другие устройства запоминают ключ, а не сертификат.
Это важно, потому что самоподписанный сертификат сам по себе ничего не доказывает. Он говорит «этот ключ создал этот сертификат», а не «это Mac из вашей гостиной». Кто-то должен связать ключ с физическим устройством, и этот кто-то вы.
Шесть цифр
Когда iPhone встречает Mac впервые, на обоих экранах появляется шестизначный код. Вы подтверждаете, что они совпадают. Если да, каждое устройство сохраняет ключ другого. Если нет, между ними кто-то сидит, и вы отклоняете запрос.
Этот код не случаен и не является паролем. Это короткий хеш всего рукопожатия: ID обоих устройств, свежие одноразовые ключи с каждой стороны, одноразовые случайные числа с каждой стороны и ключ личности Mac. Точнее, это первые четыре байта SHA-256 от этих полей, приведённые к шести десятичным цифрам. Если злоумышленник ретранслирует соединение, Mac и iPhone видят разные записи рукопожатия, а значит, и разные числа.
Зачем сначала фиксировать
В шестизначном коде всего миллион значений, поэтому хитрый злоумышленник мог бы перебирать одноразовые ключи, пока обе стороны случайно не покажут одно число. Протокол закрывает эту лазейку шагом фиксации и раскрытия:
- Каждая сторона сначала отправляет хеш своего одноразового ключа и случайного числа.
- Только когда оба хеша получены, любая из сторон раскрывает настоящие значения.
- Каждая сторона сверяет раскрытое значение с хешем, полученным ранее.
Злоумышленнику приходится фиксировать значения, ничего не увидев, поэтому подогнать их под нужный код он не может. Остаётся слепая догадка с шансом один на миллион совпасть за попытку, а неудачная попытка проявляется как несовпадение, которое вы видите.
Короткий путь через QR
Если вы сканируете QR-код на Mac, сравнивать глазами нечего. В QR-коде лежит 16-байтный секрет, который мог знать только тот, кто видит экран Mac. iPhone использует его, чтобы вычислить доказательство (HMAC от рукопожатия), а Mac принимает его как подтверждение, что связывающий физически находится перед Mac. Без этого доказательства Mac просит подтверждения у своего пользователя.
После связывания доверие это сравнение ключей
Каждое следующее соединение это сеанс TLS 1.3, где обе стороны предъявляют свой ключ. iPhone берёт ключ Mac из сертификата, который он на самом деле получил, а не из того, что Mac сообщает в сообщении, и сравнивает его с сохранённым за постоянное время. Другой ключ означает отсутствие соединения. После первого раза от вас ничего не требуется.
Если Mac заявляет «я вас уже знаю», а у iPhone нет сохранённого ключа этого Mac, iPhone отказывает. Заявление ничего не доказывает, ведь посторонний скажет то же самое так же легко.
Практическая инструкция есть в руководстве по связыванию. О том, что происходит с соединением, когда оно уже есть, см. что видит релей.
Вопросы
Нужен ли Peering аккаунт или адрес электронной почты?
Нет. Каждое устройство создаёт свой ключ и хранит его в своём Keychain. Связывание это шестизначный код, который вы сверяете на двух экранах.
От чего защищает шестизначный код связывания?
От того, кто сидит между iPhone и Mac. Код выводится из всего рукопожатия, поэтому атакующий посередине даёт на двух экранах разные коды, и несовпадение видно.