Tagi NFC — zabezpieczenia, aktywacja sprzętowego licznika i konfiguracja ASCII mirror
28.03.2016 | aktual.: 28.03.2016 23:05
Technologia zbliżeniowa NFC (Near Field Communications) zadomowiła się już dość dobrze w urządzeniach ze średniej półki cenowej. Jej wykorzystanie do szybkiego łączenia (parowania) ze sobą zgodnych urządzeń jest bardzo łatwe za pomocą choćby funkcji udostępnionej przez Google - Android Beam. Telefony wymieniają się danymi z wykorzystaniem komunikacji zbliżeniowej, pozwalającej nawiązać bezpośrednie połączenie i przesłać niewielkie ilości danych, a dla większych paczek multimedialnych nawiązać łączność Bletooth lub Wi‑Fi Direct, by przesłać udostępnione pliki.
Z technologii NFC możemy również skorzystać w połączeniu z tagami NFC. Niewielki chip o szerokości rzędu 0,5mm połączony z anteną, będącą jednocześnie cewką zasilającą. Pole elektromagnetyczne generowane przez moduł NFC w smartfonie, indukuje w cewce taga prąd, którym jest zasilany chip. Dane są przesyłane na częstotliwości 13,56MHz z prędkością od 106 do 848 kbit/s w zależności typu taga. Trwałość takiej pamięci wynosi 100 tysięcy zapisów, a o dane możemy być spokojni przez 10 lat.
Jak wiemy, tagi mogą być w formie breloczków, kart czy naklejek. Zastosowanie takich znaczników może być dość szerokie, które wychodzą możliwościami ponad funkcjonalność kodów QR. Możemy na nich zapisać adresy stron, numery telefonów, adresy lub inne dane wykorzystywane do inicjowania różnych akcji w smartfonach, przy wykorzystaniu różnych aplikacji. Za pomocą takich dedykowanych aplikacji możemy też w łatwy sposób programować tagi na własne potrzeby.
Bardzo popularne są obecnie tagi oznaczone symbolami NTAG213, NTAG215 oraz NTAG216. Różnią się między sobą pojemnością pamięci, której udostępniono dla użytkownika odpowiednio 144, 504 oraz 888 bajtów. Dostępne są też układy MIFARE, posiadające nawet 4kB pamięci, jednak nie każdy telefon je obsługuje oraz ich cena jest znacznie wyższa.
Tagi z serii NTAG21x mają coś jeszcze, co można wykorzystać w swoich projektach. Oprócz pamięci typu EEPROM na dane, chipy udostępniają takie funkcje jak:
- zabezpieczenie zapisu/odczytu hasłem
- trwała blokada zapisu
- zdefiniowanie ilości nieudanych prób odblokowania hasłem
- wewnętrzny licznik odczytań taga
- automatyczne dołączenie numeru seryjnego i/lub licznika do odczytywanego ciągu z pamięci
Uaktywnienie i konfiguracja pierwszych dwóch funkcji możemy w prosty sposób dokonać za pomocą większości aplikacji do obsługi NFC, jednak pozostałe już nie koniecznie. Przynajmniej ja nie spotkałem się z takimi narzędziami w darmowych programach.
Zanim zaczniemy się zagłębiać w konfigurację, proponuję zaopatrzyć się w poniższe aplikacje, które pomogą w "operacji":
Zabezpieczanie hasłem i blokowanie taga NFC
Po zapisaniu danych na naszego taga, możemy mieć potrzebę zabezpieczenia go przed nieautoryzowanym skasowaniem czy nadpisaniem przez niepowołane osoby, jednocześnie nie chcemy całkowicie blokować zapisu. Z pomocą przyjdzie nam popularny program NFC Tools, za jego pomocą możemy ustawić potrzebne zabezpieczenia.
Aby zabezpieczyć zapis naszym hasłem, należy wybrać opcję "Ustaw hasło" w zakładce "RÓŻNE". Po jej wybraniu podajemy hasło, na które przeznaczono aż 32 bity. Po zapisaniu danych na tagu, możemy go odczytywać do woli, jednak aby coś na nim zapisać musimy zdjąć zabezpieczenie opcją "Usuń hasło" i podaniem naszego hasła. Jak go zapomnimy, to już nic nie będzie można zmienić. Jeśli stwierdzimy, że chcemy permanentnie zablokować zapis, posłużymy się opcją "Zablokuj tag". Spowoduje to ustawienie odpowiedniej flagi w pamięci chipu, przez co pamięć stanie się tylko do odczytu.
Za pomocą aplikacji RE-AD NFC reader/writer możemy dodatkowo ustawić zabezpieczenie przed odczytem - przyda się gdy będziemy chcieli przekazać jakąś tajną informację innej osobie, która będzie musiała odblokować taga przed odczytem. Posłużymy się tutaj opcją "Protect NFC tag" z zakładki "OTHERS". Mamy tutaj dodatkowe opcje, którymi możemy ograniczyć ilość błędnych prób odblokowania niepoprawnym hasłem i ostatecznie zablokować całkowicie taga. Domyślnie tagi nie mają ograniczeń co do ilości błędnych prób odblokowania.
Organizacja pamięci taga NFC
Generalnie pamięć jest podzielona na tzw. strony, których jest odpowiednio 45, 135 i 231 w zależności od pojemności. Każda strona ma 4 bajty zapisane szesnastkowo. Pierwsze 4 strony i 5 ostatnich, jest zarezerwowane na takie dane jak numer seryjny, wpisy konfiguracyjne, hasła itp.
Najbardziej będą nas interesować obszary pamięci z adresu [29] i [2A], to tam można ustawić potrzebne wartości, by włączyć i skonfigurować dodatkowe funkcje.
Jak widzimy, uaktywnienie i ustawienie odpowiedniej funkcji będzie się odbywało na zasadzie modyfikacji odpowiednich bitów, następnie ich zmianie na wartość szesnastkową dla każdego bajtu i ostatecznie zapisania całej strony do pamięci. Przyda się nam zatem kalkulator BIN‑HEX. Dalej omawiane modyfikacje, będę opierał na powyższych tabelach, adresy stron będę podawał w HEX.
Wewnętrzny licznik taga NFC
Może nie wszyscy o tym wiedzą, ale nasz chip radiowy posiada wewnętrzny licznik o wielkości 24 bitów (maksymalna wartość 16777216), który zlicza kolejne odczyty. Domyślnie jest on wyłączony i aby coś zliczał należy ustawić odpowiednią flagę w obszarze pamięci konfiguracyjnej taga. Do wszystkich działań będzie nam potrzebny edytor HEX pamięci taga, umożliwiający odczyt i zapis pod konkretnym adresem. Przydatny nam będzie tutaj RFID NFC Tool, który umożliwia pracę na wybranych stronach pamięci.
Przystępujemy zatem do włączenia licznika, którego wartość jest zapisana oczywiście w HEX. W bajcie nr 0 (ACCESS) pod adresem [2A], w bicie 4 (NFC_CNT_EN) aktywujemy licznik. Wartość 0 oznacza wyłączony, a 1 włączony. Domyślnie cała strona mojego tagu pod adresem [2A] ma wartość taką:
[2A] : 00 05 00 00
Odczytujemy powyższą wartość aplikacją RFID NFC Tool po wybraniu opcji "Mifare Ultralight / NTAG". Kładziemy smartfon na tagu i nie zdejmujemy, aby utrzymać cały czas połączenie. Aby włączyć licznik, bit nr 4 w pierwszym bajcie musi przyjąć wartość 1. Czyli cały bajt oraz strona będzie miała wartość taką:
wartość pierwszego bajtu nr 0: 10000b = 10h pozostałe 3 bajty przepisujemy i ostatecznie mamy wartość: [2A] : 10 05 00 00
Teraz w polu "Page number (hex)" wpisujemy adres 2A, a w polu "Data content (hex)" wpisujemy wartość całej strony (4 bajty), czyli: 10050000. Następnie wciskamy "Write" - komunikat "Write successful" oznajmia, że wszystko przebiegło poprawnie i możemy już odsunąć tag. Wynik naszych działań możemy sprawdzić aplikacją NFC TagInfo by NXP, która odczyta nam wszystkie dane wraz z zrzutem całej pamięci. Od teraz każde odczytanie taga, będzie powiększało wartość licznika o 1, oczywiście zapisane w HEX.
ASCII mirror
Funkcja ta powoduje zapisanie w wybranym obszarze pamięci numeru seryjnego UID i/lub wartości licznika przy każdym odczycie. Aby można było skorzystać z zapisanych danych, musimy wstępnie zapisać jakiś rekord z danymi jak tekst, adres URL itp. oraz ciąg znaków w miejsce których zostaną zapisane lustrzane dane. Ustawień będziemy dokonywać pod adresem [29] w pierwszym i trzecim bajcie. Mamy następujące opcje do wyboru:
bajt nr 0, bit 7 i 6 (MIRROR_CONF): 00 - wyłączony ASCII mirror 01 - zapis UID (potrzebne 14 bajtów miejsca) 10 - zapis licznika NFC (potrzebne 6 bajtów miejsca) 11 - zapis UID oraz licznika (potrzebne 21 bajtów miejsca)
Powiedzmy, że chcemy przepisywać wartość licznika, więc kolejną rzeczą jaką musimy zrobić to zapisać w pamięci jakieś dane np. jakiś tekst oraz dodatkowe 6 znaków na wartość licznika. Przykładowo:
Licznik: xxxxxx
Do zapisania danych użyjemy standardowej opcji aplikacji NFC Tools: ZAPIS>Dodaj pozycję>Tekst. Następnie przyda nam się zrzut pamięci z aplikacji "TagInfo", ponieważ będziemy musieli precyzyjnie określić od którego bajtu zaczyna się miejsce na nasz licznik. Pierwszy znak "x" zaczyna się u mnie pod adresem [09] od bajta nr 3.
Dalej pod adresem [29] w bajcie nr 0, bit 5 i 4 przeznaczone są na określenie numeru bajta od którego rozpocznie się zapis, czyli tam gdzie występuje pierwszy "x" - tutaj nr 3.
bajt nr 0, bit 5 i 4 (MIRROR_BYTE): 00 - bajt nr 0 01 - bajt nr 1 10 - bajt nr 2 11 - bajt nr 3
Cały bajt nr 2 (MIRROR_PAGE) pod adresem [29], określa adres strony gdzie występuje pierwszy nasz "x", czyli w tym przypadku będzie to adres [09].
Po odczytaniu pamięci z taga, pod adresem [29] mamy wartość:
[29] : 04 00 00 FF
Pierwszy bajt nie jest zerowy, więc musimy rozłożyć go na ciąg bitów, dokonać zmian i z powrotem zamienić na HEX:
bajt nr 0: 04h = 100b zmieniamy bit 7, 6 oraz 5 i 4: wartość przed zmianą 00000100b wartość po zmianie 10110100b = B4h bajt nr 2: 09h ostatecznie cała strona pod adresem [29] przyjmie wartość: [29] : B4 00 09 FF
Stronę zapisujemy tak samo jak to było w przypadku licznika. Po tej operacji znaki "x" zostaną zamienione na bieżącą wartość licznika podczas każdego odczytu i w tym przypadku otrzymamy taki komunikat:
Praktyczne zastosowanie
Sam licznik możemy wykorzystać do prowadzenia statystyki tagu. Przykładowo robimy plakat reklamowy z tagiem kierującym do strony internetowej lub komponujący wiadomość albo zapisujący wizytówkę czy wybierający numer telefonu. Każdy kto go odczyta powiększy licznik, a my możemy co jakiś czas sprawdzić ile osób zainteresowało się naszym tagiem.
ASCII mirror UID z licznikiem możemy wykorzystać jako parametr przekazywany w adresie strony do której zapiszemy link. Można w ten sposób jednoznacznie identyfikować taga i przekazać bieżący stan licznika do bazy danych.
To już wszystko, bardziej zainteresowanych tematem odsyłam do karty katalogowej serii NTAG21x, gdzie można znaleźć wszystkie potrzebne informacje.