Программирование nfc меток – NFC Эксперт – 23.10.2019

Ещё немного про безопасность

Одним из вариантов хранения учетных данных карты и конфиденциальной информации на смартфоне является Security Element. Мы помним, что SE это физический чип, на который установлены апплеты каких-то приложений с конфиденциальными данными, например, апплет платежного приложения, транспортного и т.д.

Любые конфиденциальные данные, например, данные, связанные с виртуальной картой, которые хранятся в SE, защищены так же, как и на физической бесконтактной карте. Однако есть одно важное отличие. SE постоянно подключен к смартфону и через смартфон к Интернету.

Потенциал для атак намного выше, чем для реальной карты. К данным на обычной карте можно получить доступ, только если она оказывается рядом с бесконтактным считывателем, и только в том случае если бесконтактный считыватель был взломан. Из этого следует необходимость ограничить доступ к апплетам на SE.

И вот, еще одна некоммерческая организация, которая занимается разработкой спецификаций для безопасных цифровых экосистем в США, Global Platform выпустили спецификацию доверенной среды исполнения, или TEE. Эта среда, такой слой между ОС мобильного устройства и SE, в котором обмен данными и командами защищен. Вот тут спецификации Global Platform по криптографическим алгоритмам, системной архитектуре TEE и т.д.

Trusted Execution Environment — доверенная среда исполнения.GlobalPlatform TEE Internal API — внутренний API доверенной среды исполнения. Trusted Core Environment — доверенная среда ядра. Trusted Functions — доверенные функции. TEE Kernel — ядро доверенной среды исполнения.

HardWare secure resources — аппаратные ресурсы безопасности. Hardware Platform — аппаратная платформа. Rich OS — операционная система. GlobalPlatform TEE client API — клиентские API доверенной среды исполнения. Rich OS application environment — основная среда исполнения приложений в операционной системе.

Использование технологии HCEПоследние версии операционной системы Android поддерживают Host Card Emulation или HCE. Использование HCE означает, что команды NFC можно направлять прямо в API, работающее в операционной системе мобильного устройства.

Любая необходимая защита должна быть реализована поверх реализации HCE. Приложение может пересылать команды NFC в любое место, доступное для смартфона. Это делает варианты реализации виртуальной карты практически безграничными — от полностью облачной карты до хранения (части) виртуальной карты в SE.

Поскольку HCE не обеспечивает безопасность, эта технология используется совместно с уже известными TEE и токенизацией. TEE предоставляет сервисы безопасности и изолирует доступ к своим аппаратным и программным ресурсам безопасности от многофункциональной ОС и связанных приложений.

Как работает nfc?

Вы наверняка знаете, что NFC расшифровывается как Near Field Communication или по-русски — связь ближнего действия.

Но это не обычная передача данных по радиоволне. В отличие от Wi-Fi и Bluetooth NFC устроен хитрее. В основе лежит электромагнитная индукция. Это очень крутая штука из школьной программы, напомню.

Идея в том, что вы берете один проводник, в котором нет электричества. И кладете рядом с ним второй проводник, в котором есть электричество. И знаете, что? В первом проводнике, где электричества не было, начинает течь ток!

Круто, да?

Когда мы впервые про нее узнали, подумали, что такое невозможно! Серьезно? Вы гоните! Пошли играть в Counter Strike, пацаны.

Ну так вот, когда вы подносите смартфон к какой-нибудь NFC метке без питания, этого крошечного электромагнитного поля от смартфона достаточно, чтобы внутри метки побежали электроны, и заработали микросхемы внутри неё.

Ах да. В каждой метке есть крошечная микросхема. Например, в банковских картах микрочип запускает даже простенькую версию Java. Каково?

Может быть вы ещё слышали аббревиатуру RFID. Её разработали лет на 30 раньше. Она расшифровывается как радиочастотная идентификация. И по сути только для идентификации и подходит. Во многих офисных центрах пропуска до сих пор с RFID.


Так вот NFC является продвинутой веткой стандарта RFID и читает часть таких меток. Но главное отличие в том, что NFC умеет еще и передавать данные, в том числе зашифрованные.

NFC работает на частоте 13,56 МГц, что позволяет развить неплохую скорость от 106 до 424 Кбит/с. Так что mp3-файл скачается за пару минут, но только на расстоянии до 10 см.

Физически NFC — это маленькая катушка. Например в Pixel 4 прикреплена к крышке и выглядит вот так.

А так в Xiaomi Mi 10 Pro:

И тут как раз пора поговрить о том, что умеет делать NFC?

Работа этой технологии и смежных, вроде RFID, описаны в стандарте ISO 14443.  Там еще много чего свалено в кучу: например, итальянский протокол Mifare и VME — это в банковских картах.

NFC — это своего рода USB Type-C в мире беспроводных технологий, если вы понимаете, о чем я.

Но главное вот что. NFC может работать в трех режимах:

  1. Активный. Когда девайс считывает или записывает данные с метки или карточки. Кстати, да, данные на NFC метки можно и записывать.
  2. Передача между равноправными устройствами. Это когда вы подключаете к смартфону беспроводные наушники или используете Android Beam — помните такое. Там по NFC происходило подключение, а сама передача файла шла уже по Bluetooth.
  3. Пассивный. Когда наше устройство прикидывается чем-то пассивным: платежной картой или проездным.

Зачем NFC, если есть Bluetooth и Wi-Fi, ведь у них и скорость, и радиус действия больше.

Бонусы NFC вот в чем:

  1. Мгновенное подключение — одна десятая секунды.
  2. Низкое энергопотребление — 15 мА. У Bluetooth до 40 мА.
  3. Теги не требуют собственного питания.
  4. И не столь очевидное — малый радиус действия, что необходимо для безопасности и оплаты.


Есть правда еще Bluetooth Low Energy, но это отдельная история.

Структура ndef

NDEF используется для форматирования данных обмена между устройствами и метками. Данный формат типизирует все сообщения, которые используются в NFC, причём не важно для карты это или для устройства. Каждое NDEF-сообщение содержит одну или несколько NDEF-записей. Каждая из них содержит уникальный тип записи, идентификатор, длину и поле для информации, которую нужно сообщить.

Есть несколько распространённых типов NDEF-записей:

  1. Обычные текстовые записи. В них можно отправить любую строку, они не содержат инструкций для цели, но содержат метаданные об языке текста и кодировке.
  2. URI. Такие записи содержат данные об интернет-ссылках. Цель, получившая такую запись, откроет её в том приложении, которое сможет её отобразить. Например, веб-браузере.
  3. Умная запись. Содержит не только веб-ссылки, но и текстовое описание к ним, чтобы было понятно, что находится по этой ссылке. В зависимости от данных записи телефон может открыть информацию в нужном приложении, будь то SMS или e-mail, либо сменить настройки телефона (громкость звука, яркость экрана и т.д.).
  4. Подпись. Она позволяет доказать, что информация, которая была передана или передаётся, достоверна.

Можно использовать несколько видов записей в одном NDEF-сообщении.

Можно представить сообщение как параграф, а записи — как предложения. Параграф — определённая единица информации, которая содержит одно или несколько предложений. Тогда как предложение — меньшая единица информации, которая содержит всего одну идею. Например, можно в виде абзаца сделать приглашения на день рождения и написать в отдельных предложениях данные о дате, времени и месте проведения, а с помощью NDEF-сообщений передать друзьям напоминание об этом событии, где будет текстовое сообщение с описанием события, умную запись с местом и веб-ссылку с тем, как добраться до этого места.

Второе главное различие между NFC и RFID — формат обмена данными NFC (NDEF — NFC data exchange format). NDEF определяет формат данных в сообщениях, которые в свою очередь состоят из NDEF записей. Есть несколько видов записей, о которых будет рассказано более подробно чуть ниже.

NDEF содержит информацию о байтовом представлении сообщений, которые могут содержать несколько записей. У каждой записи есть заголовок, в котором находятся метаданные (тип, длина и т.д.), и информацию для отправки. Если вернуться к аналогии с параграфом, то параграф формируется из предложений, относящихся к одной теме, так и в NDEF-сообщениях — хорошо, когда все записи относятся к одной тематике.

NDEF-сообщения в основном короткие, каждый обмен состоит из одного сообщения, каждая метка также содержит одно сообщение. Так как обмен NFC данными происходит при касании одного устройства другим или меткой, то будет неудобно передавать в одном сообщении текст целой книги, поэтому длина NDEF-сообщения сопоставима с длиной абзаца, но не целой книги.

NDEF-запись содержит информацию для пересылки и метаданные, как эту информацию интерпретировать. Каждая запись может быть разного типа, о чем объявляется в заголовке этой записи. Также в заголовке описывается какое место занимает запись в сообщении, после заголовка следует информация. На рисунке ниже представлена полная информация о расположении бит и байт информации в NDEF-записи.

Место на информацию в NDEF-записи ограниченно по размерам 2^32-1 байтами, однако можно делать цепочки записей внутри сообщения, чтобы переслать информацию большего размера. В теории нет ограничений на NDEF-сообщения, но на практике размер сообщения ограничивается возможностями устройств или меток, участвующих в обмене информацией.

Если в обмене участвуют только устройства, то длина сообщения будет ограничена вычислительной мощностью самого слабого из устройств, но стоит учесть, что устройства придётся долго держать рядом для пересылки всех данных. При взаимодействии смартфона и карты длина сообщения будет ограничена размером памяти карты.

В общем, обмен данными через NFC достаточно быстрый. Человек подносит мобильное устройство к метке, происходит краткий обмен информацией, и человек идёт дальше. Данная технология не была спроектирована для длительных обменов информацией, потому что устройства в буквальном смысле должны находится в паре сантиметров друг от друга.

Для того чтобы передать большой объем информации, устройства придётся держать друг рядом с другом длительное время, это может быть неудобным. Если нужно длительное взаимодействие между устройствами, то можно воспользоваться NFC для быстрого обмена данными о возможностях устройств и последующего включения одного из более подходящих способов передачи данных (Bluetooth, Wi-Fi и т.д.).

Когда телефон на Android считывает NFC-метку, он сначала её обрабатывает и распознает, а затем передаёт данные о ней в соответствующее приложение для последующего создания intent. Если с NFC может работать больше одного приложения, то появится меню выбора приложения. Система распознавания определяется тремя intent, которые перечислены в порядке важности от самой высокой до низкой:

  1. ACTION_NDEF_DISCOVERED: Этот intent используется для запуска аctivity, если в метке содержится NDEF-сообщение. Он имеет самый высокий приоритет, и система будет запускать его в первую очередь.
  2. ACTION_TECH_DISCOVERED: Если никаких activity для intent ACTION_NDEF_DISCOVERED не зарегистрировано, то система распознавания попробует запустить приложение с этим intent. Также этот intent будет сразу запущен, если найденное NDEF-сообщение не подходит под MIME-тип или URI, или метка совсем не содержит сообщения.
  3. ACTION_TAG_DISCOVERED: Этот intent будет запущен, если два предыдущих intent не сработали.

В общем случае система распознавания работает, как представлено на рисунке ниже.

Когда это возможно, запускается intent ACTION_NDEF_DISCOVERED, потому что он наиболее специфичный из трёх. Более того, с его помощью можно будет запустить ваше приложение.

Если activity запускается из-за NFC intent, то можно получить информацию с отсканированной NFC-метки из этого intent. Intent может содержать следующие дополнительные поля (зависит от типа отсканированной метки):

  • EXTRA_TAG (обязательное): объект Tag, описывающий отсканированную метку.
  • EXTRA_NDEF_MESSAGES (опциональное): Массив NDEF-сообщений, просчитанный с метки. Это дополнительное поле присуще только intent ACTION_NDEF_DISCOVERED.
  • EXTRA_ID (опциональное): Низкоуровневый идентификатор метки.

Ниже представлен пример, проверяющий intent ACTION_NDEF_DISCOVERED и получающий NDEF-сообщения из дополнительного поля.

Kotlin

override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    ...
    if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
        intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages ->
            val messages: List = rawMessages.map { it as NdefMessage }
            // Обработка массива сообщений.
            ...
        }
    }
}
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    ...
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        Parcelable[] rawMessages =
            intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMessages != null) {
            NdefMessage[] messages = new NdefMessage[rawMessages.length];
            for (int i = 0; i < rawMessages.length; i  ) {
                messages[i] = (NdefMessage) rawMessages[i];
            }
            // Обработка массива сообщений.
            ...
        }
    }
}

Kotlin

val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

Существует несколько методов для создания NDEF-записи: createUri(), createExternal() и createMime(). Лучше использовать один из них во избежание ошибок, которые могут возникнуть при создании записи вручную. Все примеры, представленные ниже, следует отправлять первым сообщением при записи метки, либо сопряжением с другим устройством.

Kotlin

Транспортная инфраструктура

Программирование nfc меток - NFC Эксперт - 23.10.2019Рис. 11. Эволюция транспортных билетов.Legacy media – устаревшие билеты. New media – новые билеты (технологии). Paper tickets – бумажные билеты. Light interface – оптический интерфейс. Contactless cards – бесконтактные карты. Contactless interface – бесконтактный интерфейс. Mobile tickets – мобильные билеты. NFC interface – интерфейс NFC.

У всего есть эволюция, например, на этом рисунке показана эволюция транспортных билетов. Ручной труд давно канул в Лету, жетоны и бумажные билеты тоже. Потом, за ними и билеты с магнитной полосой и билеты со штрих-кодами. Сейчас эволюция транспортных билетов остановилась на бесконтактных транспортных картах. Расцвет эры NFC в транспортной инфраструктуре.

Вот тут NFC Forum white paper о применении NFC на транспорте. Очевидные преимущества от внедрения: простота использования, мультикарта, которая действует на несколько видов транспорта, можно пополнить баланс через приложение, а не стоять в очереди, экологичность и прочее.

Сейчас бесконтактные транспортные карты на базе меток NFC прочно вошли в транспортную инфраструктуру. Причем, такие карты работают не только в транспортной инфраструктуре городов, на горнолыжных курортах система подъемников тоже использует карты на базе NFC меток.

РеализацияМосметро анонсировали  услугу «Мобильный билет», в процессе предоставления сервиса участвуют операторы сотовой связи (ОАО «МТС», ПАО «Мегафон», ОАО «ВымпелКом») ООО «Бриз Технологии», ГУП «Московский метрополитен» (Метрополитен)

, ГУП «Мосгортранс». Операторы сотовой связи предоставляют потребителю SIM-карту со встроенным чипом NFC, SE и подключаемой услугой мобильного билета. В этом случае оплата за транспортный тариф происходит через NFC SIM-карты со счета мобильного номера в транспортное приложение.

Оплата проезда осуществляется одним касанием телефона к валидатору транспортного оператора, т.е. для пользователя все просто.Можно ли сделать так же, но без замены сим-карты? В первую очередь, мобильное устройство должно поддерживать NFC и SE.

Во вторую очередь, платежное приложение должно напрямую работать с приложением транспортного оператора. Иными словами, если транспортную карту можно будет интегрировать в Google Pay. И Google Pay добавили такую возможность, но она пока что в каком-то полуживом режиме, по крайней мере транспортные карты действующие в России Google не понимает. Поэтому, нет.А вот для Apple есть такая услуга.

Apple Pay с Mastercard: простой и удобный способ оплаты. Оплатить проезд в метро и на МЦК с помощью Apple Pay можно в кассах, автоматах по продаже билетов, а также прямо на турникетах. Опять же, если у вас не мастеркард, то не забывайте транспортную карту.Есть приложения для мобильных устройств, которые позволяют оплачивать проездной электронным платежом, инициализируя карту через NFC, например, «мой проездной». Подробности о работе тут.

ПроблемыПервая и очевидная проблема внедрения услуги электронного билета это в единообразии. В необходимости выбора единого стандарта и единого технического решения для всех транспортных операторов, моделей телефонов и т.д.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *