25
Droidcon Moscow 2015 NFC-платежи в Android Антон Курицын, CardsMobile

Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Embed Size (px)

Citation preview

Page 1: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Droidcon Moscow 2015

NFC-платежи в AndroidАнтон Курицын, CardsMobile

Page 2: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

● Объем бесконтактных платежей за 2014 год составил $4,9 млрд.

● Процент платежей с мобильных устройств по предварительным оценкам вырастет до 5%

к концу 2015 года (0,5% в 2014 году).

● Все топовые модели смартфонов совместимы с бесконтактными платежами

(с появлением HCE, всё что для этого нужно - модуль NFC).

NFC-платежи в Android

Page 3: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

● Физические интерфейсы:

○ Магнитная полоса.

○ Контактная площадка.

○ Беспроводная высокочастотная связь.

● Проведение транзакций:

○ Magstripe-транзакции:

■ Использование статических данных с трека магнитной полосы.

○ EMV-транзакции:

■ Использование PKI-инфраструктуры и симметричного шифрования.

● Подходит для внедрения в смартфон:

○ NFC + EMV.

○ Magstripe (с некоторыми оговорками).

Существующая инфраструктура платежей банковскими картами

Page 4: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Мобильные технологии для текущей инфраструктуры

● Magstripe:

○ LoopPay.

● Contactless (ISO 14443):

○ Secure Element:

■ Embedded Secure Element (eSE).

■ UICC Secure Element.

■ MicroSD Secure Element.

○ HCE:

■ Android >= 4.4.

■ Windows >= 10.

■ BlackBerry >= 7.

Page 5: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Отличия Secure Element и Host-card Emulation

Page 6: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

● Общение с картой производится с помощью APDU (Application Protocol Data Unit)

● Различие в HCE и SE реализациях — обработчик команд:

○ Secure Element.

○ CPU, Cloud и т.д. в случае с HCE.

Пример (SELECT PPSE и ответ):

Command: 00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00

Response: 6F 2F 84 0E ... A5 1D BF 0C 1A 61 18 4F 07 A0 00 00 00 03 10 10 50 0A 56 49 53 41 20 44 45 42 49

54 87 01 01 90 00

Общение телефона и терминала

Page 7: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

ВЗАИМОДЕЙСТВИЕ С SE ИЗ ANDROID

Page 8: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Особенности работы с SE (com.android.nfc_extras)

● Отсутствие стандартного API для работы с SE.

● Для открытия канала к SE надо иметь соответствующие права.

→ До Android 4.0.4: приложение должно быть подписано корректным сертификатом

(как правило, сертификатом вендора).

→ Android 4.0.4+ : сертификат должен быть включен в /etc/nfcee_access.xml

Для осуществления полноценного взаимодействия (создание инстансов апплетов,

их удаление и т.д.) нужно иметь ключи для доступа Issuer Security Domain

(выдаются вендором).

● Процесс общения SE с терминалом программными средствами не регулируется.

Page 9: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

com.android.nfc_extras

NfcAdapterExtras

● Методы для работы с SE-соединением:void open()void close()byte[] transceive(byte[] in)

● Actions для интентов обратной связи:

ACTION_APDU_RECEIVED

ACTION_AID_SELECTED

NfcExecutionEnvironment● static NfcAdapterExtras get(NfcAdapter adapter)● public NfcExecutionEnvironment getEmbeddedExecutionEnvironment()

Page 10: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

● В /etc/nfcee_access.xml должен быть добавлена подпись и пакет приложения

(в случае отсутствия имени пакета, доступ предоставляется всем приложениям

с этим сертификатом):...

<signer android:signature="123В...А987">

<package android:name="com.myownreachbank42.wallet".>

</signer>

...

● В AndroidManifest.xml добавляем nfc_extras-библиотеку:

<uses-library

android:name="com.android.nfc_extras"

android:required="true" />

Подготовка к работе

Page 11: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

● В SDK этих классов и методов нет.

● Отправляем APDU-команду и получаем ответ:

Отправка APDU

public byte[] sendApduCommand(byte[] apduCommand) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {

Class nfcExtrasClazz = Class.forName("com.android.nfc_extras.NfcAdapterExtras");Method getMethod = nfcExtrasClazz.getMethod("get", Class.forName("android.nfc.NfcAdapter"));NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);Object nfcExtras = getMethod.invoke(nfcExtrasClazz, adapter);

Method getExecutionEnvironmentEMethod = nfcExtras.getClass().getMethod("getEmbeddedExecutionEnvironment", (Class[]) null);Object ee = getExecutionEnvironmentEMethod.invoke(nfcExtras, (Object[]) null);

Class executionEnvironmentClazz = ee.getClass();Method openMethod = executionEnvironmentClazz.getMethod("open", (Class[]) null);Method transceiveMethod = executionEnvironmentClazz.getMethod("transceive", new Class[]{byte[].class});Method closeMethod = executionEnvironmentClazz.getMethod("close", (Class[]) null);

openMethod.invoke(ee, (Object[]) null);Object response = transceiveMethod.invoke(ee, apduCommand);closeMethod.invoke(ee, (Object[]) null);

return (byte[]) response;}

Page 12: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Другие варианты: Open Mobile API (org.simalliance.openmobileapi)

Channel

...public byte[] transmit(byte[] command) throws IOException...

Session

...Channel openLogicalChannel(byte[] aid)

Channel openBasicChannel(byte[] aid)public void closeChannels()...

Page 13: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Минусы:

❏ Малая распространенность технологии

❏ Необходимость работы с вендорами

❏ Отсутствие единого API по работе с SE

Плюсы и минусы работы с SE

Плюсы:

❏ Стойкость ко взлому

❏ Возможность платить картой

с выключенным экраном

(карта по умолчанию)

Page 14: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

HOST CARD EMULATION

Page 15: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

● Появилась начиная с KitKat.

● Работает на большинстве современных смартфонов с Android 4.4+ и NFC.

● Система на основании нескольких параметров ([Host/OffHost]ApduService, Tap&Pay-

меню) определяет, куда отправить APDU-команду (SE или сервис приложения).

HCE реализация

Page 16: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

❏ AID теперь прописывается на уровне конфигурационного файла.

❏ Возможность обрабатывать APDU команды напрямую в коде приложения

(Host Card Emulation).

❏ Пользователь имеет возможность выбирать приложение, обрабатывающее

команды POS-терминала (через меню Tap&Pay).

❏ Через систему роутинга проходит всё: APDU, предназначающиеся для SE и

для Host-реализации.

❏ Кого считать обработчиком (SE или Host-реализацию),

определяет класс от которого наследуется APDU-сервис:android.nfc.cardemulation.OffHostApduService

android.nfc.cardemulation.HostApduService

Основные возможности

Page 17: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

AndroidManifest.xml:

<service

android:name="com.myownsuperbank2.wallet.hce.WalletHostApduService"

android:exported="true"

android:permission="android.permission.BIND_NFC_SERVICE">

<intent-filter>

<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>

</intent-filter>

<meta-data

android:name="android.nfc.cardemulation.host_apdu_service"

android:resource="@xml/host_apdu_service"/>

</service>

host_apdu_service.xml:

...

<aid-group

android:description="@string/aiddescription"

android:category="payment">

<aid-filter android:name="A0000000041010" />

<aid-filter android:name="A00000015100000000" />

<aid-filter android:name="A00000000300000000" />

<aid-filter android:name="325041592E5359532E4444463031" />

<aid-filter android:name="A0000000049999" />

</aid-group>

...

Регистрация Host/Off-host сервиса

Page 18: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Реализация Host-based сервиса@TargetApi(Build.VERSION_CODES.KITKAT)

public class WalletHostApduService extends HostApduService {

@Override

public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {

//Обрабатываем входящую APDU-команду здесь

//byte[] responseApdu = process(commandApdu);

//return responseApdu;

//В случае, если ответ будет асинхронным, отдаем APDU на обработку и возвращаем null

Intent serviceIntent = new Intent(this, WalletService.class);

serviceIntent.setAction(WalletService.ACTION_HCE_COMMAND_APDU);

serviceIntent.putExtra(WalletService.EXTRA_HCE_APDU, commandApdu);

startService(serviceIntent);

return null;

}

private LocalBroadcastReceiver mResponseApduReceiver = new LocalBroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

byte[] apdu = intent.getByteArrayExtra(WalletService.EXTRA_HCE_APDU);

sendResponseApdu(apdu);

}

};

}

Page 19: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Реализация OffHost-based сервиса@TargetApi(Build.VERSION_CODES.KITKAT)

public class WalletOffHostApduService extends OffHostApduService {

@Override

public IBinder onBind(Intent intent) {

return null;

}

}

Page 20: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Установка платежного сервиса по умолчанию

@TargetApi(Build.VERSION_CODES.KITKAT)private void checkTapAndPayDefault() {

if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {return;

}final CardEmulation cardEmulation = CardEmulation.getInstance(NfcAdapter.getDefaultAdapter(this));final ComponentName apduService = new ComponentName(this, WalletOffHostApduService.class);if (!cardEmulation.isDefaultServiceForCategory(apduService, CardEmulation.CATEGORY_PAYMENT)) {

final Intent changeDefault = new Intent(CardEmulation.ACTION_CHANGE_DEFAULT);changeDefault.putExtra(CardEmulation.EXTRA_SERVICE_COMPONENT, apduService);changeDefault.putExtra(CardEmulation.EXTRA_CATEGORY, CardEmulation.CATEGORY_PAYMENT);startActivity(changeDefault);

}}

Page 21: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Нюансы при реализации Cloud Based Payments (MasterCard)

● Одноразовые платежные токены (SUK - Single Use Key) зашифрованы с

использованием Mobile PIN.

● Профиль пользователя и токен хранятся в шифрованной БД приложения.

● Помимо SSL, используется дополнительная Secure Session для передачи профиля,

ключей и при сервисных операциях.

● Возможны неочевидные для пользователя ситуации (совпадение AID’ов в разных

приложениях и т.д.).

● Проверка на ROOT обязательна.

Page 22: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

WALLET SDK

Page 23: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

● Разработка платежного решения подразумевает длительный этап тестирования и настройки.

● Мы предлагаем готовый SaaS-сервис и его обслуживание.

Wallet SDK

Мы предлагаем решение «под ключ»,

которое можно встраивать

в любые партнерские приложения для идентификации.

Page 24: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

API для банковских клиентов

Page 25: Droidcon Moscow 2015. NFC-платежи в Android. Антон Курицын - Кошелек

Спасибо за внимание!Курицын Антон

+7 911 983 36 58

[email protected]