Багато технологій, якими ми користуємося щодня, розчиняються у фоні. Підносиш телефон, щоб заплатити, відімкнути двері, зчитати мітку чи поділитися контактом, і про протокол під сподом навіть не згадуєш. NFC належить саме до такої тихої інженерії: її помічаєш, лише коли щось не спрацювало. За роки роботи над NFC.cool, застосунком для читання і запису NFC-міток, я залазив у цю інженерію глибше, ніж більшість людей коли-небудь захоче. Ось як воно насправді працює в iPhone: розповім так, як пояснив би допитливому другу.
Що таке NFC
Near Field Communication працює як бездротовий протокол малого радіуса: два пристрої обмінюються даними, коли опиняються приблизно за 4 см один від одного. Для себе я описую його як спрощеного родича 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 у платіжному терміналі прокидається в цьому полі, повідомляє, хто він, і обмінюється з телефоном невеликою порцією криптографічних даних. Дані картки при цьому не залишають Secure Element, окремий чип, апаратно ізольований від решти телефона. Назовні йде тільки одноразовий токен.
Коли підносиш телефон до NFC-наліпки на афіші, ролі міняються місцями. Мітка на афіші пасивна, батарейки в ній немає. Зчитувач iPhone живить її, мітка у відповідь віддає записи NDEF, які на ній зберігаються, а iOS вирішує, що з ними робити: відкрити посилання, запустити застосунок, показати контакт або виконати Швидку команду. Саме в цій другій половині, на боці мітки, живе NFC.cool. А якщо хочеться побачити все в дії без встановлення, на Android можна зчитати мітку просто з браузера.
NDEF: спільна мова
Над радіочастиною NFC стоїть рівень даних NDEF, тобто NFC Data Exchange Format. Я описую його як крихітний формат самоописових записів: на мітці лежить один або кілька записів, і кожен має свій тип (URI, текст, vCard, дані Wi-Fi, власний MIME) та корисне навантаження.
NDEF розуміє кожен телефон з NFC на планеті, тому мітка, записана на Android, спокійно читається на iPhone і навпаки. Мобільний світ рідко має спільні стандарти, а тут iOS та Android справді користуються одним. За цю сумісність я вдячний найбільше: пишу під формат, а не під платформу. Якщо кортить створити власні записи, я розібрав усе покроково в статті як записати NFC-мітку на iPhone.
Приватність і безпека
Тут варто згадати два рівні захисту, ті самі, які я пояснюю найчастіше:
Дальність. Кілька сантиметрів важко перехопити без помітної антени, і саме з такої моделі загроз виріс увесь дизайн NFC.
Токенізація. Apple Pay ніколи не передає справжній номер картки. Кожна операція йде з Device Account Number і одноразовою криптограмою, яку створює Secure Element. Навіть зламаний термінал не зможе повторити її.
Зі зчитуванням міток поверхня атаки інша, бо довіряти доводиться самій мітці. Коли ти сам контролюєш її вміст (домашня автоматизація, власна візитівка), хвилюватися нема про що. Коли підносиш телефон до випадкової мітки десь у місті, iOS усе одно спершу покаже запит на підтвердження. А якщо мітка має зберігати таємницю, а не просто вказувати на неї, я беру криптографічні чипи; про них ішлося в статті як зберігати зашифровані секрети на NFC-мітках.
Чому це важливо
NFC належить до протоколів, які зникають, щойно починають працювати як слід, і саме тому будувати на ньому приємно. Підносиш телефон до турнікета, платіжного термінала, візитівки, розумної колонки, і щось відбувається. Ні спарювання, ні PIN-коду, ні запуску застосунку. Лише свідомий фізичний жест, який дозволяє рівно один конкретний обмін.
Заради цього я і зробив NFC.cool Tools: щоб усі можливості NDEF були під рукою, і без попереднього вивчення протоколу. Зчитай будь-яку мітку, запиши на неї дані якого завгодно типу, а наприкінці заблокуй. На iPhone або на Android.