
Setiap tahun semakin banyak perusahaan yang menunjukkan minat pada proyek yang terkait dengan Internet of Things ( IoT ).
Pada artikel ini, saya akan berbicara tentang platform IoT yang telah kami buat, cara memuat kartu bank ke perangkat yang dapat dikenakan, menjelajahi kemampuan kerangka kerja Core NFC iOS, dan kemungkinan skema penipuan menggunakan smartphone dengan NFC.
Artikel ini dapat bermanfaat bagi manajer produk, ahli teknologi, pengembang iOS, teknisi QA yang terlibat dalam pembayaran seluler, serta siapa pun yang tertarik dengan teknologi fintech untuk memperluas wawasan mereka.
Halo, Habr!
Nama saya Maxim. Saya telah melakukan pengembangan industri sejak 2005. Saya telah bekerja di Wallet sejak 2013, dan sejak 2015 saya telah membantu bisnis perusahaan mengembangkan layanan fintech baru sebagai kepala divisi.
Di Wallet, tim kami telah meluncurkan banyak produk inovatif. Ini adalah salah satu kartu bank virtual penuh pertama di dunia dalam telepon pintar dengan kemungkinan pembayaran nirsentuh (setahun sebelum peluncuran Apple Pay di Rusia dan jauh sebelum peluncuran Kartu Apple), dan kartu transportasi pertama , dan kartu kipas pertama , dan kartu kampus pertama di telepon pintar. ...
Tahun lalu, bersama dengan Mastercard, kami meluncurkan layanan Wallet PayMerupakan satu-satunya layanan di dunia yang, tidak seperti mitranya, berfungsi terlepas dari produsen ponsel cerdas atau sistem operasinya. Misalnya, Pay Wallet berfungsi pada smartphone Huawei yang tidak memiliki layanan Google.
Ucapan Terima Kasih
Kolya Ashanin , yang memotivasi saya untuk menulis artikel dan membantu saya selama persiapan untuk publikasi.
Sasha Pryimak, yang di bawah pengawasan saya, melakukan penelitian yang dijelaskan dalam artikel.
Juga, terima kasih banyak atas partisipasi dan dukungan Anda:
Katya Turkina, Anton Davydov, Lesha Ershov, Dasha Alekseenko.
Platform IoT
Saat ini, saya dan tim sedang mengerjakan peluncuran platform Internet of Things yang akan dapat melengkapi dan memperluas pengalaman yang ada dalam menggunakan layanan Pay dan menerapkan pembayaran (dan layanan identifikasi lainnya) dalam hal-hal yang biasanya kami bawa - yang disebut perangkat yang dapat dikenakan.
Internet of Things adalah konsep objek fisik yang akrab yang dilengkapi dengan teknologi untuk berinteraksi dengan lingkungan eksternal atau satu sama lain.
Dalam konsep ini, kasus penggunaan yang sudah dikenal untuk berbagai hal dibuat ulang melalui otomatisasi.
Contoh perangkat yang dapat dikenakan adalah jam tangan pintar, gelang kebugaran, cincin, kunci kontak.
Jika sebelumnya seseorang memakai cincin karena keindahan atau simbolismenya, sekarang dalam konsep Internet of Things, cincin berfungsi sebagai alat pembayaran, sebuah akses kontrol akses., remote control untuk perangkat pintar lainnya, dll. Dengan demikian, kasus penggunaan baru yang nyaman muncul untuk hal yang sudah dikenal.
Hal-hal pintar sekarang menjadi tren global. Ini dibuktikan dengan data statistik yang dikumpulkan oleh berbagai lembaga dunia (lihat tautan di bagian akhir artikel).
Dalam artikel ini, saya ingin menggunakan contoh penelitian kami dalam pengembangan platform IoT untuk memberi tahu Anda tugas apa saja dari arah fintech aplikasi Wallet, masalah apa yang kami hadapi, dan bagaimana kami menggunakan teknologi industri kartu yang telah terbukti untuk membuat produk baru.
Untuk memulainya, saya akan menjelaskan secara singkat dan dengan kata-kata sederhana teknologi yang menjadi dasar platform kami. Jika Anda tertarik untuk membaca lebih lanjut tentang teknologi ini, akan ada tautan di akhir artikel.
- , Secure Element β , 5-20 . , -, , - , . , SIM-, . ( ).
, β . , . - GlobalPlatform Card Specification β , .
- TSM (Trusted Service Manager) β . .
- EMV β ( ), . , - , , .
Berikut adalah skenario utama untuk interaksi ponsel cerdas dengan perangkat itu sendiri, yang kami masukkan ke dalam platform kami (dalam semua skenario, pengguna mengontrol perangkat yang dapat dikenakan melalui antarmuka aplikasi seluler pada ponsel cerdas):
Skenario pertama adalah interaksi dengan perangkat yang dapat dikenakan yang aktif. Perangkat yang dapat dikenakan disebut perangkat aktif yang memiliki baterai sendiri (misalnya, baterai). Biasanya, benda tersebut memiliki sistem operasinya sendiri dan ada modul BLE untuk komunikasi dengan smartphone. Produsen perangkat menyediakan SDK dan kunci akses untuk berinteraksi dengan elemen keamanan.
Beginilah cara kerja semua jam tangan pintar dan gelang kebugaran dengan fungsi pembayaran nirsentuh. Semuanya sederhana dan jelas - kami mengambil dan melakukannya.
Skenario kedua lebih menarikApakah interaksi dengan perangkat yang dapat dikenakan pasif. Perangkat yang dapat dikenakan disebut perangkat pasif yang tidak memiliki baterai sendiri. Perangkat ini diberi daya oleh medan magnet eksternal di mana mereka harus ditempatkan. Ini bisa berupa medan elektromagnetik pembaca terminal nirkontak atau antena NFC pada ponsel cerdas. Jadi, kartu bank nirkontak dapat dengan aman disebut perangkat pasif yang dapat dikenakan.
Masalahnya adalah Anda perlu memuat kartu bank Anda ke perangkat pasif yang dapat dikenakan dari aplikasi di ponsel cerdas Anda.
Kami (secara kondisional) memecahkan skenario ini sesuai dengan jenis ponsel cerdas:
- Ponsel cerdas apa pun tanpa NFC
- Ponsel pintar Android dengan NFC
- iPhone dengan NFC
Untuk tipe pertama, kami akan menggunakan pembaca eksternal yang terletak di terminal personalisasi khusus. Singkatnya, terminal personalisasi dan aplikasi seluler di smartphone terhubung ke backend yang sama, yang menyinkronkan kedua klien. Token dimuat melalui terminal personalisasi, dan pengguna melihat hasilnya di antarmuka aplikasi seluler.
Penerapan terminal personalisasi dapat berbeda: dapat berupa smartphone pengguna yang sama yang terhubung ke pembaca kartu pintar eksternal melalui BLE atau USB, atau dapat berupa perangkat eksternal otonom (komputer lengkap dengan pembaca yang terhubung dengannya, akses Internet dan perangkat lunak kontrol) ...
Untuk tipe kedua (Android with NFC), implementasinya jelas. Dalam hal ini, smartphone dapat digunakan sebagai terminal, memberi daya pada perangkat pasif dari antena NFC dan memuat token kartu bank ke dalamnya.
Dalam penelitian kami, saya akan menjelaskan secara detail bagaimana kami bekerja pada jenis smartphone ketiga (iPhone dengan NFC). Sebagai perangkat yang dapat dikenakan, kami menggunakan fob kunci dari ISBC , mitra yang kami luncurkan uji coba.
Tujuan penelitian
Bisakah kita mengaktifkan pengguna Dompet iOS untuk memuat kartu bank mereka ke perangkat yang dapat dikenakan dengan menyambungkannya ke iPhone?
Yaitu:
- Pengguna dalam aplikasi "Dompet" memasukkan data kartu banknya
- Pengguna menyandarkan perangkat yang dapat dikenakan di bagian belakang iPhone
- Kartu bank dimuat ke perangkat yang dapat dikenakan
Karenanya, tugas teknisnya adalah untuk menentukan apakah mungkin untuk memuat kartu bank ke dalam elemen keamanan eksternal (Elemen Aman) menggunakan iPhone biasa dan antena NFC -nya , melalui protokol ISO / IEC 7816 (T = CL).
Tugas tambahan:
- Dapatkan ATR (Answer To Reset) dari chip tanpa mengeluarkannya dari pembaca
- Dapatkan UID (Unique Identifier) ββdari chip
Data ini dapat berguna karena sering digunakan untuk mengidentifikasi chip dalam sistem penyedia layanan dan membedakan kunci dari data sensitif aplikasi chip.
Apa yang kita miliki:
- iPhone 8 dengan iOS 13.5
- Uji perangkat yang dapat dikenakan - keyfob ISBC dengan chip JCOP 3 EMV P60 tertanam dan applet yang dimuat dari NXP :
PPSE dan applet yang menerapkan M / Chip Advance - Pembayaran Spesifikasi Kartu dan Penyimpanan Data v1.1; - kunci dari chip Domain Keamanan Penerbit.
Keputusan
Pada awalnya, kami akan menguraikan tugas utama, yaitu, kami akan menentukan langkah-langkah yang diperlukan untuk mengubah gantungan kunci yang benar-benar biasa (yah, hampir) menjadi alat pembayaran lengkap:
- Membuat koneksi antara chip dan modul NFC pada iPhone
- Pemasangan applet Mastercard M / Chip Advance dan PPSE pada chip
- Mempersonalisasi applet
Membangun koneksi
Di sinilah kita akan berbicara tentang fitur-fitur kerangka kerja Core NFC yang ditambahkan di iOS 13.
Ngomong-ngomong, di iOS 14 tidak ada perubahan signifikan yang terjadi terkait subjek artikel, jadi semua yang dijelaskan relevan untuknya.
Jadi, di Apple OS versi ketigabelas, menjadi mungkin tidak hanya untuk membaca data dari tag NFC , seperti di iOS 12 (tetapi tidak lebih awal dari iOS 11, sebelumnya, interaksi melalui NFC hanya mungkin dalam Apple Pay), tetapi juga untuk menulisnya, dan juga berkomunikasi dalam bahasa perintah APDU dengan chip apa pun yang memenuhi salah satu standar berikut:
Untuk melakukan ini , dua kelas baru telah ditambahkan ke Core NFC : NFCNDEFReaderSession dan NFCTagReaderSession .
Yang pertama digunakan untuk berinteraksi dengan tag NDEF, dan yang kedua digunakan untuk yang lainnya .
Dalam kasus kami, ini adalah chip yang mendukung Spesifikasi Kartu GlobalPlatform 2.2.1 dan standar ISO / IEC 7816 , yang berarti kami akan menggunakan kelas kedua.
The dokumentasi mengatakan apa yang perlu Anda lakukan (selain menulis kode, tentu saja) untuk mulai berkomunikasi dengan chip sesuai dengan ISO 7816:
- Berikan string yang tidak kosong untuk kunci NFCReaderUsageDescription di file info.plist aplikasi Anda.
- Tambahkan daftar pengenal aplikasi yang didukung dalam aplikasi Anda ke kunci daftar properti informasi
com.apple.developer.nfc.readersession.iso7816.select-identifiers .
Tetapi di bawah ini ada batasan yang menarik: Kami hanya ingin "merasakannya", setelah mempelajari apa sebenarnya artinya. Tambahkan baris, misalnya "Izinkan koneksi NFC" untuk kunci NFCReaderUsageDescription di file info.plist . Ini juga berfungsi dengan nilai lain dari kunci ini.
Important
Core NFC doesn't support payment-related Application IDs.

[Di sini, di kolom kiri, bukan kunci itu sendiri, tetapi deskripsinya, Xcode menyembunyikan nama formal]
Selanjutnya, jika kita ingin berinteraksi dengan chip, seperti dengan perangkat ISO / IEC 7816 , maka nilai kunci com.apple.developer.nfc.readersession. iso7816.select-identifiers menentukan daftar ID dari semua applet (Application Identifier atau AID), yang dengannya aplikasi akan berinteraksi.

Perlu dijelaskan di sini bahwa pengenal ini bukan hanya kumpulan karakter acak.
Ini adalah string heksadesimal yang berisi informasi tentang aplikasi yang ditugaskan padanya.
AID bisa sepanjang 5 sampai 16 byte (dua karakter per baris = satu byte). Mereka terdiri dari dua bagian, yang pertama mengidentifikasi penyedia aplikasi (untuk Mastercard adalah "A000000004"), yang kedua mengatakan jenis produk penyedia ini (untuk produk bernama "Mastercard" adalah "1010", dan, misalnya, untuk Maestro adalah "3060 ").
Selain itu, terkadang diperlukan untuk meletakkan informasi tambahan di AID, misalnya, jika ada dua aplikasi yang identik dari penyedia yang sama pada chip, tetapi untuk bank yang berbeda. Untuk ini ada dukungan untuk Long AID (atau Extended AID). Selama AID tidak melebihi 16 byte, Anda dapat menulis apapun padanya. Misalnya, kami mengambil Mastercard AID dan pada akhirnya menambahkan "TEST" padanya, hasilnya: "A0000000041010BB5445535401".
Satu-satunya AID yang berada di luar daftar adalah "325041592E5359532E444446303101".
Faktanya, ini adalah yang biasa (hanya dalam format hex), seperti yang mereka katakan, string teks biasa "2PAY.SYS.DDF01". Ini adalah AID PPSE, yang bukan merupakan applet pembayaran. Ini hanya berisi data lingkungan yang dibutuhkan oleh aplikasi pembayaran.
Memasang applet
Untuk memasang applet pada sebuah chip, Anda membutuhkan koneksi yang aman (Secure Channel Protocol atau SCP); kami melakukannya di belakang layar menggunakan pembaca PC / SC konvensional dan platform TSM Cardsmobile .
Namun, meskipun Anda tidak memiliki semua ini, Anda masih dapat mencoba memasang applet Anda sendiri pada sebuah chip - hanya pada virtual.
Anda memerlukan IDE apa pun dengan dukungan JCOP Shell dan emulator JavaCard, misalnya yang ini .
Buat proyek kosong, tentukan AID yang diinginkan (misalnya, 0000000000) dan jalankan.
Kemudian kami memahami langkah-langkahnya:
- / card
Dapatkan ATR, kirim SELECT tanpa ID sehingga Card Manager dipilih;

- auth
, ;

- ls ()
, /;

- install [packageAID] [appletAID] [instanceAID]
:
packageAID β (Module), , Β«0000000000Β»
appletAID β (Load File), , Β«000000000000Β»
instanceAID β , , , Β«A0000000041010Β»;

- ls
, :

Sebenarnya, mempersonalisasi applet itu sangat sederhana; semua yang diperlukan adalah memuat data pembayaran yang diperlukan ke dalamnya. Untuk melakukan ini, Anda perlu memilih applet dengan perintah SELECT dengan AID-nya, membuat koneksi aman dan mengirim applet yang dipilih perintah STORE DATA dengan data di dalamnya.
Sekarang mari kembali ke daftar AID di file info.plist - mengapa ini diperlukan, dan bagaimana tepatnya Core NFC memilih applet mana yang akan digunakan?
Ini terlihat seperti ini:
- Program ini menelusuri daftar dari atas ke bawah;
- Untuk setiap AID, ia menghasilkan dan mengirimkan perintah SELECT;
- AID applet pertama yang menjawab "9000" (status respons berhasil, berikut daftar semua kemungkinan respons ) dicatat di bidang initialSelectedAID dari objek jenis NFCISO7816Tag , yang dimasukkan ke dalam larik chip yang terdeteksi
@available(iOS 13.0, *)
public protocol NFCISO7816Tag : NFCNDEFTag, __NFCTag {
/**
* @property initialSelectedAID The Hex string of the application identifier (DF name) selected by the reader when the tag is discovered.
* This will match one of the entries in the Β«com.apple.developer.nfc.readersession.iso7816.select-identifiersΒ»
* in the Info.plist.
*/
@available(iOS 13.0, *)
var initialSelectedAID: String { get }
Selanjutnya, Anda dapat memilih objek seperti itu dari larik, dan menggunakan metode sendCommand untuk mengirim perintah APDU ke applet yang dipilih.
Sekarang mari kita bicara tentang batasan ini:
Core NFC doesn't support payment-related Application IDs.
Artinya, Core NFC tidak mendukung AID pembayaran, yaitu, memerangi AID yang digunakan terminal pembayaran.
Tentu saja, Anda dapat menambahkan AID pembayaran ke daftar info.plist, tetapi Core NFC akan mengabaikannya dan tidak akan mengirim SELECT untuknya (ngomong-ngomong, berikut adalah daftar semua AID yang digunakan ). Beginilah cara Apple melindungi teknologi Apple Pay-nya, mencegah pengembang pihak ketiga mengakses salah satu fitur pembayaran iPhone (dan semua yang terkait dengannya).
Solusi
Hal pertama yang terlintas dalam pikiran adalah apakah mungkin menambahkan ke info.plist bukan AID dari applet pembayaran, tetapi Manajer Kartu AID (Manajer Kartu adalah sekelompok layanan di dalam sistem operasi chip yang mengelola kartu, yang bertanggung jawab untuk administrasi dan keamanan), sehingga lalu secara manual mengirimkan perintah SELECT dengan AID dari applet yang diinginkan?
Di sini kami menemukan kesalahan pertama - Core NFC tidak mengizinkan pengiriman perintah SELECT yang berisi AID yang tidak terdaftar di info.plist .
Oke, kami menambahkan A0000000041010, tetapi ini juga gagal - Core NFC tidak mengizinkan pengiriman perintah SELECT yang berisi AID pembayaran, terlepas dari apakah itu ada di info.plist atau tidak.
Mari kita lihat cara kerja pembatasan ID.
Di info.plist kami telah menentukan AID berikut:
1. A000000001510000 - GlobalPlatform Card Manager AID
2. 325041592E5359532E444446303101 - Proximity Payment System Environment (PPSE)
3. A0000000041010 - Mastercard Credit/Debit (Global)
4. A00000000401 - Mastercard PayPass
5. A00000000410101213 - Mastercard Credit
6. A00000000410101215 - Mastercard Credit
7. A00000000410101214 - AID
8. A00000000410101216 - AID
9. A0000000041010121F - AID
10. A0000000041010BB5445535401 - Long AID
11. A0000000041010BB5445535405 - Long AID
12. A000000004101FBB5445535401 - AID
13. A000000004101F1213 - AID
14. A00000000F1010 - AID
15. A0000000040F - AID
Kami memasang 14 applet pembayaran dengan AID berbeda (item 2-11 - pembayaran AID), dan mencoba mengirim perintah PILIH Manajer Kartu dengan masing-masing AID ini.
Angka 12-15 dijawab .
Ternyata pembatasan tersebut diberlakukan pada awalan AID tertentu, yang keberadaannya menentukan apakah itu pengenal pembayaran atau bukan.
Sangat disayangkan, tetapi metode ini tidak berlaku lagi.
Opsi personalisasi kedua yang disediakan oleh GlobalPlatform adalah perintah INSTALL [untuk personalisasi].

Ini dikirim ke Manajer Kartu dan berisi AID applet yang perlu dipersonalisasi.
Kemudian Anda dapat mengirim perintah STORE DATA ke Card Manager, yang akan meneruskannya ke aplikasi target.
Tapi ada satu batasan. Agar applet mendukung personalisasi semacam ini, applet harus menerapkan antarmuka org.globalplatform.Application .
Manajer Kartu, ke perintah INSTALL [untuk personalisasi] dengan AID Kredit / Debit (Global) Mastercard , yang ditugaskan ke applet M / Chip Advance dari NXP , menjawab dengan kesalahan "6985" (Kondisi penggunaan tidak dipenuhi),
yang berarti Anda perlu memeriksa apakah itu diterapkan apakah itu antarmuka Aplikasi .
Untuk melakukan ini, kami menulis aplikasi dummy sederhana yang mengimplementasikan antarmuka ini. Seperti yang diharapkan, itu menjawab "9000" pada INSTALL [untuk personalisasi].
Tetapi ketika Aplikasi dihapus dari antarmuka yang diimplementasikan oleh aplikasi, itu mulai merespons perintah ini "6985", seperti dalam kasus applet M / Chip Advance.
Akibatnya, masalahnya justru aplikasi NXP tidak mengimplementasikan antarmuka yang diperlukan untuk personalisasi semacam itu. Metode ini juga menghilang.
Tugas tambahan
- Memperoleh UID dari Chip
Ini dapat dilakukan dengan cara yang sangat sederhana.
Pada awal sesi NFC , modul mencari chip, AID appletnya terdaftar di info.plist, dan menambahkannya ke array.
Setelah itu, Anda bisa mendapatkannya dari sana, dan jika tipenya adalah NFCISO7816Tag , maka ia memiliki bidang pengenal, yang berisi UID chip.
/** * @discussion The hardware UID of the tag. */ var identifier: Data { get }
- Memperoleh chip ATR
Tetapi tampaknya Core NFC tidak dapat menerima ATR , karena tidak ada alat terpisah untuk ini dalam kerangka kerja, dan Anda tidak bisa mendapatkan ATR menggunakan perintah APDU .
kesimpulan
Apa intinya?
- ISO/IEC 7816 ( UID), Core NFC;
- , Apple ;
- , , iPhone, , Application β ;
- , AID β .
Menjawab pertanyaan yang diajukan di awal, dapatkah kami memberi pengguna Wallet kesempatan untuk memuat kartu bank mereka ke key fob dengan memasangnya ke iPhone - tidak, ini belum memungkinkan.
Sebagai bagian dari tugas, kami memutuskan untuk menggunakan pembaca BLE eksternal untuk memuat token kartu bank dari iPhone ke perangkat pasif yang dapat dikenakan.
Mudah-mudahan, di masa depan, Apple akan memperluas kemampuan NFC Core untuk mencapai ini dan berbagai tugas tokenisasi dan pembayaran lainnya di aplikasi pihak ketiga. Namun, berita terbaru memberi sinyal bahwa hal ini kemungkinan tidak akan terjadi dalam waktu dekat.
Efek samping penelitian
Dalam proses pengerjaannya, lahirlah skema potensi penipuan yang tidak dapat direproduksi menggunakan smartphone Apple, namun sangat memungkinkan untuk diimplementasikan melalui smartphone Android dengan dukungan NFC dan teknologi Host Card Emulation.
Intinya adalah:
- smartphone pertama akan digunakan sebagai terminal, yaitu, akan terhubung ke kartu bank dan berinteraksi dengan applet pembayaran mereka,
- smartphone kedua - sebagai alat pembayaran (di kasir akan terlihat seperti pembayaran biasa dengan smartphone).
Dengan skema ini, Anda dapat membuat kartu bank berantai - smartphone - smartphone - terminal pembayaran, yaitu:
- Ponsel cerdas pertama terpasang ke kartu bank mana pun;
- Yang kedua diterapkan ke terminal pembayaran;
- Ponsel cerdas kedua mengemulasi kartu bank dengan mengirimkan perintah APDU yang dikirim oleh terminal ke ponsel cerdas pertama;
- Ponsel cerdas pertama mengirimkan perintah ini ke kartu bank yang terpasang, mengirimkan tanggapannya ke ponsel cerdas kedua;
- Ponsel cerdas kedua mengirimkan respons yang diterima ke terminal;
- Pembayaran telah dilakukan.
Artinya, calon penipu dapat memasukkan smartphone ke saku Anda dan membayar pembelian. Hati-hati!
Untuk menghindari menjadi korban skema penipuan seperti itu, Anda dapat, misalnya, mentransfer kartu bank ke ponsel cerdas Anda dan tidak membawa plastik.
Alih-alih kesimpulan
Saya mencoba menulis artikel dalam bahasa yang sederhana, tidak terlalu mendalami terminologi subjeknya. Di dalamnya, saya menjelaskan salah satu proyek inovatif yang sedang kami kerjakan, area subjek dan sedikit penelitian tentang fitur baru kerangka kerja iOS Core NFC.
Setiap umpan balik diterima: pertanyaan, ulasan, komentar, tambahan, kritik yang membangun.
tautan berguna
Jika Anda tertarik dengan topik yang dijelaskan dalam artikel, berikut adalah beberapa tautan untuk studi yang lebih mendetail:
- Buku oleh I. M. Goldovsky " Kartu Mikroprosesor Bank "
- Konsep Tokenisasi Pembayaran EMV
- Artikel dengan analisis pasar IoT: