Какое-то время мне постоянно попадалось одно и то же утверждение вскользь: премиальные бренды ставят в товары NFC-чипы, чтобы можно было поднести телефон к сумке или кроссовкам и понять, что вещь настоящая, а не подделка. Одна и та же красивая фраза во всех статьях, и ни в одной не сказано как. Что вообще мешает подделывателю скопировать чип вместе с сумкой?
Так что я сделал то же, что делаю всегда, когда мне любопытна метка. Зашёл на AliExpress, нашёл объявление про метки NTAG 424 DNA, заказал небольшую партию и стал ждать конверт. Несколько евро, пара недель, и на столе у меня лежал тот самый кремний, на котором строятся системы защиты брендов. Потом я поднёс к нему телефон и посмотрел, что он делает.
Что такое NTAG 424 DNA на самом деле
Снаружи это обычная NFC-метка. В куче дешёвых её не отличить, и любой телефон читает её без возражений. Если ты читал моё руководство по типам NFC-меток, она встаёт туда как ещё одна метка четвёртого типа, которую iPhone читает с удовольствием.
Отличие в приставке DNA. Внутри чип держит несколько ключей AES-128 и небольшой криптографический движок и умеет то, чего не умеет ни обычный NTAG215, ни наклейка из пачки: он может подписать каждое касание. В этой подписи и вся суть. Разница между меткой, которая говорит «вот ссылка», и меткой, которая говорит «вот ссылка, а вот криптографическое доказательство, что её отдаю именно я, этот конкретный настоящий чип, прямо сейчас».
Именно за это премиальные бренды и платят: не за ссылку, а за доказательство, что её отдаёт настоящий чип.
Как работают SUN и SDM: ссылка, которая переписывает себя при каждом касании
Вот момент, когда до меня дошло. Когда я посмотрел, что метка на самом деле отправляет, я понял, что почти всю нужную механику уже построил.
В начале года я выпустил счётчик касаний NFC: метку, которая считает, сколько раз её прочитали, и кладёт это число в ссылку, чтобы та знала, что её открывают в сорок седьмой раз. Метка NTAG 424 DNA повторяет ту же идею, обёрнутую слоем шифрования, из-за которого подделать её невозможно.
Механизм называется SUN (Secure Unique NFC), или SDM (Secure Dynamic Messaging), если читать техническое описание NXP. Ты кладёшь на метку обычную ссылку вроде https://example.com, но говоришь чипу переписывать её части на лету при каждом касании. В итоге телефон получает что-то ближе к такому:
https://example.com/?picc_data=A1B2...&cmac=9F3C...
Эти два значения не для красоты. picc_data это зашифрованная копия настоящего идентификатора метки вместе со счётчиком касаний, перемешанная ключом, который никогда не покидает чип. cmac это криптографическая подпись поверх этих данных. Оба меняются при каждом касании. Поднеси одну и ту же метку дважды, и получишь две совершенно разные ссылки, каждую подписанную чипом заново.
Обычную NFC-метку я представляю как напечатанное объявление в витрине магазина. Любой может сфотографировать его и напечатать точно такое же. Метка с SUN больше похожа на охранника, который при каждом твоём входе выдаёт новую квитанцию со своим номером и печатью. Копия вчерашней квитанции бесполезна, потому что сегодня номер другой, а настоящая печать только у охранника.
Почему скопированную метку NTAG 424 DNA поймают
Вот это и отвечает на мой исходный вопрос. Подделыватель вполне может скопировать содержимое метки. Он может прочитать ссылку, скопировать её байт в байт и записать на чистый чип. Так было всегда.
Чего он не может, так это выдать следующую верную подпись. Ключ подписи живёт внутри настоящего чипа и наружу не выходит, даже во время касания. Значит, касание чего-то стоит только для того, у кого этот ключ действительно есть. В реальной системе защиты бренда ссылка с метки ведёт на сервер производителя, и именно этот сервер расшифровывает каждое касание, пересчитывает подпись, чтобы убедиться, что ключ сходится, и следит за растущим счётчиком.
Последнее и ловит клон. Единственная ссылка, которую подделыватель может положить на фальшивку, это ссылка, перехваченная с настоящего касания, застывшая вместе с тем счётчиком, который в нём был. Повтори её, и сервер видит число, которое уже встречал, а счётчик настоящего чипа умеет двигаться только вперёд, поэтому повтор или шаг назад выдают подмену. Чтобы отправить свежий больший счётчик с подписью, которая сойдётся, нужен ключ, а чтобы получить ключ, нужно взломать AES или физически вскрыть чип. Ради поддельной сумки ни того, ни другого не случится.
Вот честная версия той рекламной фразы. Чип не делает невозможным копирование товара. Он делает невозможным копирование доказательства подлинности и переносит это доказательство туда, где подделыватель воспроизвести его не может.
Что находится внутри чипа
Всё, что NFC.cool делает с этими метками, становится понятнее, когда держишь в голове устройство чипа, так что вот карта, которую мне пришлось составить до первой строчки кода.
NTAG 424 DNA относится к меткам четвёртого типа по NFC Forum, несёт 416 байт памяти и устроена как одно приложение с тремя постоянными файлами. Создавать и удалять файлы, как на MIFARE DESFire, нельзя. Есть только эти три:
| Файл | Размер | Что в нём |
|---|---|---|
| Файл 01 | 32 байта | Контейнер возможностей, который говорит телефону, где лежат данные NDEF |
| Файл 02 | 256 байт | Сообщение NDEF, обычно твоя ссылка. При каждом чтении SUN подставляет в этот файл живые значения |
| Файл 03 | 128 байт | Собственный файл, который чип умеет держать зашифрованным. NFC.cool использует его как хранилище, подробнее ниже |
Рядом с файлами лежат пять ключей AES-128, пронумерованные с нулевого по четвёртый. Ключ 0 служит мастер-ключом приложения: именно с ним авторизуются, чтобы поменять ссылку, включить SUN, сменить любой другой ключ или тронуть настройки чипа. Ключи с первого по четвёртый сами по себе ничего не делают. Они начинают что-то значить, только когда на них указывают права доступа к файлу или настройка SUN. На новой метке все пять ключей это шестнадцать нулевых байтов, а файл NDEF доступен для записи кому угодно, поэтому свежая метка принимает обычную ссылку без всяких церемоний.
Каждая команда, которая что-то меняет, идёт внутри авторизованного сеанса: телефон и чип обмениваются встречными запросами по одному из ключей, выводят из этого сеансовые ключи, и дальше каждая команда несёт код проверки целостности или шифруется целиком. Это и есть защищённый обмен, о котором дальше идёт речь. NFC.cool реализует его полностью, и на iPhone, и на Android, и любая описанная ниже запись проходит через него.
Что показывает касание
Поднеси метку к телефону, и NFC.cool Tools на iPhone или на Android сделает глубокое чтение, ничего у тебя не спрашивая: покажет, что это за чип и не версия ли это TagTamper, ссылку, настройки и права доступа каждого файла, какие слоты ключей уже изменены с заводских и результаты трёх отдельных проверок.
Это настоящий кремний NXP?
Каждый NTAG 424 DNA выходит с завода с подписью оригинальности: подписью ECDSA поверх собственного семибайтового идентификатора чипа, сделанной закрытым ключом NXP на кривой P-224. NFC.cool читает её и проверяет по опубликованному открытому ключу NXP прямо на телефоне, и никакого ключа от тебя для этого не нужно. Если всё сходится, приложение показывает «настоящий NXP». Это ответ на первый вопрос: перед тобой настоящий кремний NXP или похожий чип, который просто откликается на то же имя?
Это касание подлинное?
Это и есть проверка SUN. Приложение берёт picc_data и cmac из ссылки, которую метка только что отдала, расшифровывает данные PICC, получая идентификатор и счётчик чтений, пересчитывает CMAC и сравнивает с тем, что прислала метка. Если сходится, ты видишь «подлинное», а счётчик появляется как число чтений.
Этой проверке нужен ключ метки, и в этом весь смысл. Метка на заводских ключах проверяется нулевым ключом. Метка, закрытая твоим ключом, проверяется тем ключом, который NFC.cool сохранил при настройке. Метка, закрытая чужим ключом, которого у тебя нет, показывает «не проверено», и это правильный ответ.
Не вскрывали ли пломбу?
Одна из версий этих чипов, NTAG 424 DNA TagTamper, сделана как пломба, показывающая вскрытие. Это наклейка с тонкой проводящей петлёй внутри. Ты клеишь её поперёк того, что защищаешь, на клапан коробки или вокруг крышки бутылки, то есть выполняешь ту же работу, что делают сегодня наклейки «гарантия недействительна при повреждении». Вскрыл вещь, порвал наклейку, разорвал петлю.
Чип следит за двумя вещами: постоянной защёлкой, которая фиксирует, вскрывали ли петлю когда-либо, и текущим состоянием прямо сейчас. NFC.cool читает оба при каждом касании и сообщает «запечатано», «вскрыто» или самое интересное, «вскрыто и запечатано заново», то есть кто-то разорвал петлю, а потом аккуратно её восстановил. Защёлка односторонняя, поэтому переклеенная коробка так и будет читаться как вскрытая до конца жизни чипа. Криптография доказывает, что чип настоящий. А это доказывает, что в коробку никто не залезал.
Программируем свою метку: короткая версия
Чтение закрывает половину дела. Вторая половина в том, что те чистые метки с AliExpress можно программировать, и минимальная настройка занимает три шага.
Запиши ссылку. Обычная запись NDEF, как на любой метке.
Включи SUN. Приложение записывает ссылку с заглушками и говорит чипу подставлять в них зашифрованный идентификатор, счётчик касаний и подпись при каждом чтении. С этого момента каждое касание даёт уникальную подписанную ссылку.
Задай свой ключ 0. Он заменяет заводские нули ключом, который знаешь только ты, и перенастроить метку больше никто не сможет.
Для последнего шага ты вводишь парольную фразу, а не ключ. NFC.cool выводит из неё ключ AES, беря первые 16 байт хеша SHA-256 от парольной фразы, одинаково на iPhone и на Android, поэтому метка, настроенная на одном устройстве, открывается той же фразой на другом. Если хочется взять ключ, сгенерированный где-то ещё, скажем на своём сервере, можно вставить 32 шестнадцатеричных символа.
Потерянный ключ означает метку, которую больше никогда не перенастроить, поэтому приложение внимательно относится к тому, где он хранится. На iPhone он попадает в Keychain и синхронизируется через iCloud Keychain. На Android он шифруется ключом с аппаратной поддержкой и дублируется в Block Store, поэтому переживает переустановку и смену телефона. Новый ключ сохраняется до отправки изменения, а если касание прервалось на середине, и старое, и новое значение остаются доступными, пока метка не подтвердит, какое из них у неё. Парольную фразу, заданную на другом устройстве, тоже можно ввести, и приложение сверит её с меткой перед сохранением.
Одну вещь приложение делать намеренно отказывается: записывать обычную ссылку на метку с включённым SUN через обычный экран записи. Смещения подстановки зафиксированы под ту ссылку, с которой их настроили, и ссылка другой длины привела бы к тому, что чип при каждом касании подставлял бы значения в середину нового содержимого. Экран NTAG 424 сначала выключает SUN и только потом пишет.
Остальная часть чипа
На короткой версии большинство руководств и останавливается, а дальше до сих пор надо было идти через TagXplorer от NXP на компьютере с USB-считывателем. Мне хотелось, чтобы всё техническое описание было доступно с телефона, поэтому я прошёл его раздел за разделом.
Все пять ключей
У ключа 0 свой экран, а ключи с первого по четвёртый лежат в разделе для продвинутых. Каждый можно задать парольной фразой или в шестнадцатеричном виде, сбросить к заводскому значению или ввести, если он был задан на другом устройстве. Любое изменение авторизуется ключом 0, потому что он распоряжается всеми пятью слотами.
SUN с ключами на твой выбор
Включение SUN это не один переключатель. Ты выбираешь режим: зашифрованный, где идентификатор едет внутри picc_data и прочитать его может только владелец ключа, или открытый, где идентификатор и счётчик стоят в ссылке в явном виде, а секретна только подпись. И ты выбираешь, какие ключи делают работу: ключ чтения метаданных, который шифрует данные PICC, и ключ чтения файла, который считает подпись. Это может быть один слот или два разных, и именно так бренд может отдать партнёру ключ, которым проверяют касания, не отдавая ключ, которым расшифровывают идентификаторы.
Приложение предупредит, если выбрать слот, который всё ещё на заводских нулях, потому что подпись известным ключом не защищает ничего. И сторона проверки понимает всё то же разнообразие: касание, подписанное ключом 3 и зашифрованное ключом 1, проверится правильно, пока эти ключи хранятся на телефоне.
Права доступа к файлам
У каждого файла четыре разрешения: чтение, запись, чтение с записью и изменение, причём последнее определяет, кто вправе править остальные три. Каждое разрешение указывает на один из пяти ключей, на «свободно» (кто угодно) или на «никогда» (никто и никогда). Так можно сказать «читать файл 02 может кто угодно, писать в него только ключ 2, а менять эти правила только ключ 0», и чип будет это соблюдать без всякого приложения.
NFC.cool показывает текущие права каждого файла и позволяет их править, и в него встроены два предупреждения. Он скажет, если разрешение указывает на ключ, которого у этого телефона нет, потому что так можно закрыть себе доступ. И он заставит подтвердить отдельным шагом установку «изменения: никогда», потому что после такой записи правила файла заморожены до конца жизни чипа.
Настройки чипа
Под файлами лежат собственные настройки чипа, которые NXP отдаёт через одну команду SetConfiguration. NFC.cool закрывает такие параметры:
Случайный идентификатор. Обычно чип сообщает всем считывателям один и тот же постоянный идентификатор, и по нему метку можно отслеживать от касания к касанию. Со случайным идентификатором он каждый раз отвечает новым случайным значением и раскрывает настоящее только после авторизации. Настоящий выигрыш для приватности, и он необратим. Приложение опознаёт метки по идентификатору, поэтому потом восстанавливает настоящий, перебирая известные ему ключи 0 через авторизованную команду GetCardUID, и метка остаётся управляемой с того телефона, где её настраивали.
Предел неудачных авторизаций. Сколько попыток с неверным ключом чип терпит, прежде чем заблокировать ключ 0. Это защита от подбора, но если поставить слишком мало, пара неудачных касаний заблокирует мастер-ключ навсегда.
Сила обратной модуляции. Повышенная или стандартная. Стандартная может не читаться на маленьких антеннах, так что значение по умолчанию разумно оставить как есть.
Цепочечная запись. Её можно отключить, и тогда одна запись ограничится одним кадром. Необратимо.
Байты возможностей. Два свободных байта, которые NXP оставляет под твои нужды.
LRP. Переключатель защищённого обмена, о котором отдельный раздел ниже.
Хранилище
Под файл 03 отведено 128 байт, которые чип умеет держать зашифрованными, и NFC.cool превращает его в небольшое личное хранилище прямо на метке. При первом сохранении приложение переводит файл в полностью зашифрованный режим и запирает все права доступа на ключ 0. Дальше в хранилище лежит до 126 байт текста, который прочитать обратно может только твой ключ, а глубокое чтение с любого другого телефона получит ошибку доступа и больше ничего.
Это для секрета, который должен путешествовать вместе с предметом, а не лежать в чьей-то базе: серийный номер, заметка себе будущему, токен, которого ждёт твой собственный сервер. Сброс ключа 0 к заводскому значению стирает хранилище, и это единственный способ его лишиться.
Режим LRP
Обычно чип защищает ключи стандартным AES, и украсть ключ означало бы взломать сам AES. Но есть путь похитрее. Положи чип на стенд, измерь слабые колебания потребления тока и электромагнитного излучения во время работы шифра, и по достаточному числу таких следов ключ восстанавливается из одной лишь утечки, вообще не трогая математику. LRP, примитив, устойчивый к утечкам, это перестроенный защищённый канал, задуманный так, чтобы утечке было не за что зацепиться. NXP описывает его в AN12304, и для наклейки на бутылке вина это явный перебор, поэтому большинство меток его никогда не включает, а большинство инструментов не умеет на нём говорить.
В моих проектных заметках к первой версии напротив пункта «режим LRP» стояло «не планируется». Меня это не отпускало, и я его сделал. NFC.cool умеет переводить метку в режим LRP и, что важнее, потом всё равно к ней авторизоваться и управлять ею: ключами, правами файлов, хранилищем, настройками чипа, всем по каналу LRP вместо AES.
Две вещи, которые надо знать до нажатия этого переключателя. Он необратим: как только метка перешла в режим LRP, защищённый обмен по AES отключается навсегда, и инструмент, который умеет только AES, больше никогда с ней не заговорит. И SUN на метке в режиме LRP недоступен, поэтому метка, чья работа подписывать касания, должна остаться на AES.
Что нельзя отменить
Многие из этих команд необратимы, и приложение говорит об этом громко в нужный момент: каждое необратимое действие требует подтверждения через предупреждение, где прямо расписаны последствия. Стоит перечислить их и здесь.
Включение LRP.
Включение случайного идентификатора.
Отключение цепочечной записи.
Установка разрешения «изменения: никогда» для файла.
Потеря ключа. Заводского сброса у чипа нет. Нет ключа 0, нет и возможности перенастроить метку.
Слишком низкий предел неудачных авторизаций, из-за которого ключ 0 блокируется после нескольких неверных касаний.
Потренируйся на запасной метке, прежде чем трогать ту, которая тебе дорога.
Где на самом деле применяют NFC-метки против подделок
Честно? Большинству тех, кто подносит телефон к NFC-метке, ничего из этого не нужно, и это нормально. Наклейка, которая открывает ссылку, прекрасная, скучная и полезная вещь.
Но, подержав такую метку в руках, начинаешь видеть применения сразу. Премиальная сумка может доказать, что она настоящая. Бутылка вина или виски может показать, что её тихо не откупоривали и не переливали, и эту половину берёт на себя пломба. Коробка с лекарством ручается и за настоящий препарат внутри, и за нетронутую пломбу. Билеты на мероприятие перестают быть тем, что можно сфотографировать и раздать, а метка у двери доказывает, что человек действительно там стоял, а не открыл сохранённую ссылку с дивана. Это та же задача подлинности, к которой цифровой паспорт продукта в Евросоюзе подбирается со стороны регулирования, но решённая на уровне отдельной вещи.
Я построил это не потому, что тысяча пользователей попросила. Я построил это потому, что из любопытства купил в интернете странные метки, разобрался, как они работают, а потом уже не смог оставить неперевёрнутой ни одну страницу технического описания. Обычно хорошие функции так и начинаются.
Итог по меткам NTAG 424 DNA
Метки NTAG 424 DNA подходят к неподделываемой пломбе ближе всего, что есть у NFC. Они не помешают скопировать товар, но делают доказательство его подлинности невозможным для подделки, потому что это доказательство свежая криптографическая подпись, которую способен выдать только настоящий чип.
NFC.cool Tools читает их, проверяет чип, касание и пломбу и отдаёт тебе весь чип для настройки: каждый ключ, права доступа к каждому файлу, собственные параметры чипа и даже LRP, всё с телефона. Если ты когда-нибудь задумывался, как одно касание отличает настоящее от подделки, поставь его на iPhone или на Android, закажи пару таких меток за несколько евро и поднеси к ним телефон сам. Отличная кроличья нора.