Jak dobrze Android NFC API obsługuje Mifare Desfire?

Prawdopodobnie będę pracował nad projektem, w którym istniejące karty Desfire (używane do dostępu do płatnych usług) zostaną zastąpione urządzeniem mobilnym obsługującym NFC. Czy ktoś może wskazać mi jakieś zasoby, które pomogą mi zrozumieć, co jest zaangażowane w a) replikacji danych karty Desfire na urządzeniu mobilnym, aby mogły one zająć miejsce karty, i b) Dla aplikacji do dostarczania danych NFC w celu przedstawienia czytelnikowi jakby to była karta. Wszystkie odpowiednie klucze i dostęp zapewni wystawca karty (jeśli projekt idzie do przodu), ale jestem chętny, aby zrozumieć proces z góry.

Muszę również zrozumieć, jak dobrze Android NFC API obsługuje Desfire, bo o ile widzę, że tylko poprawnie obsługuje Classic. http://developer.android.com/reference/android/nfc/tech/package-summary.html

Author: NFC guy, 2012-07-17

4 answers

MIFARE DESFire jest zgodny z normą ISO 14443-4. Wsparcie w Android dla ISO 14443-4 (a więc Mifare DESFire) odbywa się przez IsoDep klasy. Możesz wysłać dowolne polecenie DESFire używając metody transceive() tej klasy.

Poza tym DESFire może być skonfigurowany tak, aby był zgodny z tagiem NFC Forum type 4. W takim przypadku Android automatycznie odczyta wszystkie wiadomości NDEF z tagu i wyśle je w intencji. Możesz więc uruchomić aplikację automatycznie, gdy określony tag jest zeskanowane. (Android może również sformatować układ DESFire, aby zawierał NDEF i zapisywał do niego dane NDEF.)

Wymiana karty DESFire na mobilne urządzenie NFC to inna sprawa. Emulacja karty na aktualnie dostępnych urządzeniach z Androidem odbywa się za pomocą wbudowanego bezpiecznego elementu podłączonego do układu NFC. Aplikacja na Androida nie może emulować karty (nie ma również API do tego), a Bezpieczny Element nie może emulować układu DESFire. Ponadto, nie ma otwartego API, aby uzyskać dostęp do bezpiecznego elementu z app.

Jedynym sposobem, w jaki aplikacja NFC na Androida może komunikować się przez NFC do innego urządzenia (które nie jest kartą), jest użycie Android Beam . Jest to jednak inny protokół niż używany między kartą a czytnikiem.

 15
Author: NFC guy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-17 14:20:00

Odpowiedź NFC guy jest doskonała, ale trochę przestarzała, więc postanowiłem dodać aktualizację.

Począwszy od KitKat (4.4), możesz teraz emulować karty bez bezpiecznego elementu.

Nazywa się to emulacją kart opartych na hostach (Hce) i dzięki temu można emulować kartę ISO 14443 typu A.. Jak karta desfire.

Istnieją dwa małe zastrzeżenia:

  • Czytelnik musi wystawić, zaraz po wysłaniu "karty", ISO SELECT (aid), ze stałym ID aplikacji (aid) z twój wybór. Ta pomoc musi być zarejestrowana w manifeście aplikacji. Android przechwyci ten wybór ISO, odczyta pomoc i zadzwoni tylko wtedy, gdy pasuje do tego w manifeście. Następnie możesz wymienić wszystko, nawet nie musi to być ISO APDUs (enkapsulacja ISO 14443 jest wykonywana przez Androida). Na przykład, Jeśli chcesz, możesz nawet emulować uwierzytelnianie odpowiedzi wyzwanie desfire (0XA0 key_num, 0xaf challenge, 0xaf response, 0x00 session_key)

  • Nie możesz polegać na UID (ale tak nie jest, prawda? To i tak zła praktyka, więc nikt tego nie robi... prawda? :)) bo jest przypadkowy i zmienia się nieustannie (oczywiście nie w jednej sesji, ale..)

Emulujemy nasze karty desfire, a jedyną zmianą, jaką musieliśmy zrobić, było przejście z naszej początkowej aplikacji desfire select (0x5A) na ISO SELECT (0x00 0xa4 0x04).

Uwierzytelnianie emulujące (wyzwanie-odpowiedź rzecz) może być trudne, ale zrobiliśmy to już "na odwrót" (używając NFC do odczytu kart desfire), więc było to dla nas łatwe.

I jeśli uwierzytelnianie odbywa się za pomocą identyfikatora UID karty.. to dobry czas, aby to zmienić:)

 12
Author: Lorenzo Dematté,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-06 08:57:59

Biorąc pod uwagę twoją sytuację, powiedziałbym, że Android SDK jest więcej niż wystarczający, aby rozwiązać twój problem. Są dwie części twojej sprawy:

  1. odczytywanie informacji z istniejących kart.
  2. Tworzenie aplikacji z informacjami, które przeczytałeś z kart.

Część 1:

Musisz się martwić tylko czytaniem karty DESFire. Jeśli informacje na karcie DESFire są przechowywane w formacie NDEF, to jeszcze łatwiej.

Ndef jest klasą w SDK, którego można użyć do pobrania informacji w typie NdefMessage, którego można następnie użyć do zapisania pobranych informacji w magazynie, czy to lokalnej bazie danych, zdalnej bazie danych, czy tylko w pamięci aplikacji.

Powyższe założenie zakłada, że karta nie jest chroniona. Jeśli tak, to musisz użyć funkcji transceive do interakcji za pomocą komunikacji z surowymi bajtami. To odblokuje resztę informacji do odczytania. Stąd możesz przeczytać NDEF records.

Część 2: Moja sugestia to pomiń aspekt emulacji karty. W pewnym momencie uderzysz w ścianę.

Jeśli urządzenie, które czytało kartę w istniejącym rozwiązaniu, jest podłączone do urządzenia z Androidem, to Android Beam jest najlepszym rozwiązaniem. Co jest niczym innym, jak komunikacją aplikacji Android z aplikacją Android! Android już wykonuje ciężkie podnoszenie, więc większość twojej pracy będzie łatwa.

Informacje na karcie mogą być przechowywane jako ndef wiadomości i wysyłane przez wiązkę, lub można po prostu utworzyć niestandardowy obiekt i wysłać go przez.

 1
Author: gaara87,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-18 07:04:57

Możesz spojrzeć na Mifare4Mobile, inicjatywę skonfigurowaną do przejścia z kart Mifare do urządzeń NFC:

Http://mifare4mobile.org/

 0
Author: mpclark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-20 18:19:10