Многое из того, чем мы пользуемся каждый день, растворяется в фоне. Подносишь телефон, чтобы заплатить, открыть дверь, считать код или передать контакт, и ни разу не задумываешься о протоколе под этим. NFC как раз такая тихая деталь водопровода, а я после нескольких лет работы над NFC.cool, приложением для чтения и записи NFC-меток, провёл внутри этого водопровода больше времени, чем большинство людей когда-либо проведёт. Дальше о том, как всё устроено в iPhone, так, как я объяснил бы это любопытному другу.
Что такое NFC на самом деле
Связь ближнего поля обозначает беспроводной протокол малой дальности: два устройства обмениваются данными, когда находятся примерно в четырёх сантиметрах друг от друга. Я думаю о нём как об упрощённом родственнике Bluetooth и Wi-Fi с куда меньшим радиусом действия.
Малая дальность поначалу сбивает с толку, но это не ограничение. Это модель безопасности, и когда мне это стало понятно, многие решения в устройстве NFC встали на место. Нельзя случайно заплатить на терминале через всю комнату, и вредоносный считыватель не выкачает данные из твоего кошелька с расстояния. Если ты со всем этим только знакомишься, у меня есть спокойное руководство по NFC-меткам для начинающих, которое стартует с более раннего места, чем этот текст.
Короткая история NFC в iPhone
Впервые Apple поставила железо NFC в iPhone 6 и 6 Plus в 2014 году, но радиомодуль был закрыт и работал только на Apple Pay. Сторонние приложения не могли читать метки вообще, и человеку, который позже стал делать NFC-приложение, наблюдать за этими несколькими годами было обидно.
Всё изменила iOS 11 в 2017 году: появился фреймворк Core NFC, и разработчики вроде меня наконец получили чтение NDEF-меток. Дальше Apple открывала дверь всё шире: в iOS 13 добавилась запись, а iPhone XS и новее научились читать метки в фоне постоянно. Сегодня на любом современном iPhone метку можно поднести, ничего не открывая: система сама её распознает и предложит нужное действие.
Как NFC на самом деле передаёт данные
В каждом взаимодействии устройство с NFC играет одну из двух ролей: активную (питается и создаёт поле) или пассивную (без батарейки, берёт энергию из поля). К этой мысли я возвращаюсь всякий раз, когда меня спрашивают, как работает NFC.
Когда ты платишь через Apple Pay, активным считывателем выступает iPhone. Он создаёт радиополе на частоте 13,56 МГц. Модуль NFC в терминале просыпается внутри этого поля, представляется и обменивается с телефоном небольшой криптографической посылкой. Данные карты при этом не покидают защищённый элемент, отдельный аппаратно изолированный чип в телефоне. Наружу уходит одноразовый токен.
Когда ты подносишь телефон к NFC-наклейке на плакате, роли меняются местами. Метка на плакате пассивна, батарейки в ней нет. Считыватель iPhone её питает, метка отвечает теми записями NDEF, которые на ней лежат, а iOS решает, что делать: открыть ссылку, запустить приложение, показать карточку контакта или выполнить быструю команду. Вторая половина, то есть сторона метки, это и есть территория NFC.cool, а посмотреть на неё в деле без установки чего-либо можно, если считать метку прямо в браузере на Android.
NDEF как общий язык
Поверх радиочасти NFC лежит слой данных под названием NDEF, формат обмена данными NFC. Я описываю его как крошечный самоописывающий формат записей: на метке лежит одна или несколько записей, у каждой есть тип (ссылка, текст, vCard, данные Wi-Fi, свой тип MIME) и содержимое.
NDEF понимает любой телефон с NFC на планете, поэтому метка, записанная на устройстве с Android, спокойно читается на iPhone и наоборот. Это одно из немногих мест в мобильном мире, где iOS и Android действительно делят общий стандарт, и, честно говоря, именно этой совместимости я больше всего рад, когда делаю новые функции: я пишу под формат, а не под платформу. Если хочется попробовать записать свои записи, я разобрал это в тексте «Как записывать NFC-метки на iPhone».
Приватность и безопасность
Стоит упомянуть два слоя защиты, и как раз их я объясняю чаще всего:
Дальность. Несколько сантиметров трудно перехватить без заметной антенны, и именно от этой модели угроз NFC изначально отталкивался.
Токенизация. Apple Pay никогда не передаёт настоящий номер карты. В каждой операции участвуют номер устройства и одноразовая криптограмма, созданная внутри защищённого элемента. Даже скомпрометированный терминал не сможет её повторить.
С чтением меток поверхность угроз другая: доверие оказывается самой метке. Если ты управляешь тем, что на ней записано (свои домашние автоматизации, своя визитка), всё в порядке. Если подносишь телефон к случайной метке в общественном месте, iOS всё равно покажет подтверждение до того, как что-то произойдёт. А когда метка должна не указывать на секрет, а действительно его хранить, я беру криптографические метки, и об этом писал в тексте «Как хранить секреты на зашифрованных NFC-метках».
Почему это важно
NFC из тех протоколов, которые исчезают, когда работают, и именно поэтому мне приятно на нём строить. Подносишь телефон к турникету, платёжному терминалу, визитке, умной колонке, и что-то происходит. Ни сопряжения, ни PIN-кода, ни запуска приложения. Только осознанный физический жест, который разрешает один конкретный обмен.
Ради этого я и сделал NFC.cool Tools: чтобы весь мир NDEF был доступен, а протокол при этом никому не пришлось изучать. Считывай любую метку, записывай любой тип записи, блокируй метку, когда закончил. На iPhone или на Android.