droidcon moscow 2015. nfc-платежи в android. Антон Курицын - Кошелек
Post on 07-Jan-2017
251 Views
Preview:
TRANSCRIPT
Droidcon Moscow 2015
NFC-платежи в AndroidАнтон Курицын, CardsMobile
● Объем бесконтактных платежей за 2014 год составил $4,9 млрд.
● Процент платежей с мобильных устройств по предварительным оценкам вырастет до 5%
к концу 2015 года (0,5% в 2014 году).
● Все топовые модели смартфонов совместимы с бесконтактными платежами
(с появлением HCE, всё что для этого нужно - модуль NFC).
NFC-платежи в Android
● Физические интерфейсы:
○ Магнитная полоса.
○ Контактная площадка.
○ Беспроводная высокочастотная связь.
● Проведение транзакций:
○ Magstripe-транзакции:
■ Использование статических данных с трека магнитной полосы.
○ EMV-транзакции:
■ Использование PKI-инфраструктуры и симметричного шифрования.
● Подходит для внедрения в смартфон:
○ NFC + EMV.
○ Magstripe (с некоторыми оговорками).
Существующая инфраструктура платежей банковскими картами
Мобильные технологии для текущей инфраструктуры
● 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.
Отличия Secure Element и Host-card Emulation
● Общение с картой производится с помощью 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
Общение телефона и терминала
ВЗАИМОДЕЙСТВИЕ С SE ИЗ 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 с терминалом программными средствами не регулируется.
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()
● В /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" />
Подготовка к работе
● В 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;}
Другие варианты: 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()...
Минусы:
❏ Малая распространенность технологии
❏ Необходимость работы с вендорами
❏ Отсутствие единого API по работе с SE
Плюсы и минусы работы с SE
Плюсы:
❏ Стойкость ко взлому
❏ Возможность платить картой
с выключенным экраном
(карта по умолчанию)
HOST CARD EMULATION
● Появилась начиная с KitKat.
● Работает на большинстве современных смартфонов с Android 4.4+ и NFC.
● Система на основании нескольких параметров ([Host/OffHost]ApduService, Tap&Pay-
меню) определяет, куда отправить APDU-команду (SE или сервис приложения).
HCE реализация
❏ AID теперь прописывается на уровне конфигурационного файла.
❏ Возможность обрабатывать APDU команды напрямую в коде приложения
(Host Card Emulation).
❏ Пользователь имеет возможность выбирать приложение, обрабатывающее
команды POS-терминала (через меню Tap&Pay).
❏ Через систему роутинга проходит всё: APDU, предназначающиеся для SE и
для Host-реализации.
❏ Кого считать обработчиком (SE или Host-реализацию),
определяет класс от которого наследуется APDU-сервис:android.nfc.cardemulation.OffHostApduService
android.nfc.cardemulation.HostApduService
Основные возможности
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 сервиса
Реализация 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);
}
};
}
Реализация OffHost-based сервиса@TargetApi(Build.VERSION_CODES.KITKAT)
public class WalletOffHostApduService extends OffHostApduService {
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
Установка платежного сервиса по умолчанию
@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);
}}
Нюансы при реализации Cloud Based Payments (MasterCard)
● Одноразовые платежные токены (SUK - Single Use Key) зашифрованы с
использованием Mobile PIN.
● Профиль пользователя и токен хранятся в шифрованной БД приложения.
● Помимо SSL, используется дополнительная Secure Session для передачи профиля,
ключей и при сервисных операциях.
● Возможны неочевидные для пользователя ситуации (совпадение AID’ов в разных
приложениях и т.д.).
● Проверка на ROOT обязательна.
WALLET SDK
● Разработка платежного решения подразумевает длительный этап тестирования и настройки.
● Мы предлагаем готовый SaaS-сервис и его обслуживание.
Wallet SDK
Мы предлагаем решение «под ключ»,
которое можно встраивать
в любые партнерские приложения для идентификации.
API для банковских клиентов
Спасибо за внимание!Курицын Антон
+7 911 983 36 58
javster@cardsmobile.ru
top related