
A cada ano, mais e mais empresas demonstram interesse em projetos relacionados à Internet das Coisas ( IoT ).
Neste artigo, falarei sobre a plataforma IoT que criamos, como carregar cartões bancários em dispositivos vestíveis, explorar os recursos da estrutura Core NFC iOS e o possível esquema de fraude usando smartphones com NFC.
O artigo pode ser útil para gerentes de produto, tecnólogos, desenvolvedores iOS, engenheiros de controle de qualidade que estão envolvidos em pagamentos móveis, bem como qualquer pessoa interessada em tecnologia fintech para expandir seus horizontes.
Olá, Habr!
Meu nome é Maxim. Faço desenvolvimento industrial desde 2005. Trabalho na Wallet desde 2013 e, desde 2015, ajudo os negócios da empresa a desenvolver novos serviços de fintech como chefe de uma divisão.
Na Wallet, nossa equipe lançou muitos produtos inovadores. Este é um dos primeiros cartões bancários totalmente virtuais do mundo em um smartphone com a possibilidade de pagamento sem contato (um ano antes do lançamento do Apple Pay na Rússia e muito antes do lançamento do Apple Card), e o primeiro cartão de transporte , e o primeiro cartão de fã , e o primeiro cartão campus em um smartphone. ...
No ano passado, juntamente com a Mastercard, lançamos o serviço Wallet PayÉ o único serviço no mundo que, ao contrário de suas contrapartes, funciona independentemente do fabricante do smartphone ou do sistema operacional. Por exemplo, Pay Wallet funciona em smartphones Huawei que não têm serviços do Google.
Agradecimentos
Kolya Ashanin , que me motivou a escrever o artigo e ajudou durante sua preparação para publicação.
Sasha Pryimak, que, sob minha supervisão, realizou a pesquisa descrita no artigo.
Além disso, muito obrigado por sua participação e apoio:
Katya Turkina, Anton Davydov, Lesha Ershov, Dasha Alekseenko.
Plataforma IoT
No momento, minha equipe e eu estamos trabalhando no lançamento de uma plataforma de Internet das Coisas que será capaz de complementar e expandir a experiência existente de uso do serviço Pay e implementar o pagamento (e outros serviços de identificação) naquilo que normalmente carregamos conosco - os chamados dispositivos vestíveis.
A Internet das Coisas é um conceito de objetos físicos familiares equipados com tecnologias para interagir com o ambiente externo ou entre si.
Nesse conceito, casos de uso familiares para coisas são reconstruídos por meio da automação.
Um exemplo de dispositivos vestíveis são relógios inteligentes, pulseiras de fitness, anéis, porta-chaves.
Se antes uma pessoa usava um anel por causa da beleza ou do simbolismo, agora, no conceito da Internet das Coisas, o anel serve como um instrumento de pagamento, um passe de controle de acesso, controle remoto para outros dispositivos inteligentes, etc. Assim, novos casos de uso convenientes aparecem para o que é familiar.
Coisas inteligentes agora são uma tendência global. Isso é evidenciado por dados estatísticos coletados por várias agências mundiais (ver links no final do artigo).
Neste artigo, quero usar o exemplo de nossa pesquisa no desenvolvimento de uma plataforma de IoT para dizer com quais tarefas a direção da fintech do aplicativo Wallet está trabalhando, quais problemas enfrentamos e como usamos tecnologias comprovadas da indústria de cartões para criar novos produtos.
Para começar, descreverei brevemente e em palavras simples as tecnologias nas quais nossa plataforma se baseia. Se você estiver interessado em ler mais sobre essas tecnologias, haverá links no final do artigo.
- , Secure Element — , 5-20 . , -, , - , . , SIM-, . ( ).
, — . , . - GlobalPlatform Card Specification — , .
- TSM (Trusted Service Manager) — . .
- EMV — ( ), . , - , , .
Aqui estão os principais cenários para a interação de um smartphone com o próprio dispositivo, que colocamos em nossa plataforma (em todos os cenários, o usuário controla o dispositivo vestível por meio da interface do aplicativo móvel no smartphone):
O primeiro cenário é a interação com dispositivos portáteis ativos. Dispositivos ativos são dispositivos vestíveis que possuem sua própria bateria (por exemplo, uma bateria). Via de regra, a coisa tem seu próprio sistema operacional e há um módulo BLE para comunicação com um smartphone. O fabricante do dispositivo fornece SDK e chaves de acesso para interagir com o elemento de segurança.
É assim que funcionam todos os smartwatches e pulseiras de fitness com função de pagamento sem contato. Tudo é simples e claro - nós pegamos e fazemos.
O segundo cenário é mais interessanteÉ a interação com dispositivos vestíveis passivos. Os dispositivos vestíveis são chamados de dispositivos passivos que não possuem sua própria bateria. Esses dispositivos são alimentados por um campo magnético externo no qual devem ser colocados. Pode ser o campo eletromagnético de um leitor de terminal sem contato ou a antena NFC de um smartphone. Portanto, os cartões bancários sem contato podem ser chamados com segurança de dispositivos vestíveis passivos.
O problema é que você precisa carregar seu cartão do banco em um dispositivo passivo wearable de um aplicativo em seu smartphone.
Nós (condicionalmente) quebramos este cenário de acordo com o tipo de smartphones:
- Qualquer smartphone sem NFC
- Smartphone Android com NFC
- iPhone com NFC
Para o primeiro tipo, usaremos um leitor externo, que está localizado em terminais especiais de personalização. Em suma, o terminal de personalização e o aplicativo móvel no smartphone estão conectados ao mesmo backend que sincroniza os dois clientes. O token é carregado por meio do terminal de personalização e o usuário vê o resultado na interface do aplicativo móvel.
A implementação do terminal de personalização pode ser diferente: pode ser o mesmo smartphone do usuário conectado a um leitor de cartão inteligente externo via BLE ou USB, ou pode ser um dispositivo externo autônomo (um computador completo com um leitor conectado a ele, acesso à Internet e software de controle) ...
Para o segundo tipo (Android com NFC), a implementação é clara. Neste caso, o smartphone pode ser usado como um terminal, alimentar o dispositivo passivo da antena NFC e carregar um token de cartão do banco nele.
Em nossa pesquisa, descreverei em detalhes como trabalhamos no terceiro tipo de smartphone (iPhones com NFC). Como dispositivos vestíveis, usamos chaveiros da ISBC , um parceiro com quem estamos lançando o piloto.
Propósito do estudo
Podemos permitir que o usuário da iOS Wallet carregue seu cartão bancário em um dispositivo vestível anexando-o ao iPhone?
Ou seja:
- O usuário no aplicativo "Carteira" insere os dados de seu cartão bancário
- O usuário inclina um dispositivo vestível contra a parte de trás de um iPhone
- O cartão do banco é carregado no dispositivo vestível
Assim, a tarefa técnica é determinar se é possível carregar um cartão bancário em um elemento de segurança externo (Elemento Seguro) usando um iPhone normal e sua antena NFC , via protocolo ISO / IEC 7816 (T = CL).
Tarefas adicionais:
- Obtenha ATR (Answer To Reset) do chip sem removê-lo do leitor
- Obtenha o UID (Identificador Único) do chip
Esses dados podem ser úteis, pois costumam ser usados para identificar o chip nos sistemas dos provedores de serviço e diversificar as chaves dos dados confidenciais dos aplicativos do chip.
O que nós temos:
- iPhone 8 com iOS 13.5
- Teste o dispositivo vestível - chaveiro ISBC com um chip JCOP 3 EMV P60 incorporado e miniaplicativos carregados do NXP :
PPSE e um miniaplicativo que implementa o M / Chip Advance - Especificação de Cartão de Pagamento e Armazenamento de Dados v1.1; - chaves do chip do domínio de segurança do emissor.
Decisão
No início, decomporemos a tarefa principal, ou seja, determinaremos as etapas necessárias para transformar um chaveiro completamente comum (bem, quase) em um meio de pagamento completo:
- Estabelecendo uma conexão entre o chip e o módulo NFC do iPhone
- Instalação de miniaplicativos Mastercard M / Chip Advance e PPSE no chip
- Personalização de miniaplicativos
Estabelecendo uma conexão
É aqui que falaremos sobre os recursos do framework Core NFC adicionado no iOS 13.
A propósito, no iOS 14 nenhuma mudança significativa aconteceu em relação ao assunto do artigo, então tudo descrito é relevante para ela.
Assim, na décima terceira versão do Apple OS, tornou-se possível não apenas ler dados de tags NFC , como era no iOS 12 (mas não antes do iOS 11, antes dele, a interação via NFC só era possível dentro do Apple Pay), mas também gravá-los, e também se comunica na linguagem de comando APDU com qualquer chip que esteja em conformidade com um dos seguintes padrões:
Para fazer isso , duas novas classes foram adicionadas ao NFC principal : NFCNDEFReaderSession e NFCTagReaderSession .
O primeiro é usado para interagir com tags NDEF e o segundo é usado para todo o resto , respectivamente.
Em nosso caso, este é um chip compatível com a especificação 2.2.1 da placa GlobalPlatform e o padrão ISO / IEC 7816 , o que significa que usaremos a segunda classe.
A documentação diz o que você precisa fazer (além de escrever o código, é claro) para começar a se comunicar com o chip de acordo com a ISO 7816:
- Forneça uma string não vazia para a chave NFCReaderUsageDescription no arquivo info.plist do seu aplicativo.
- Adicione a lista de identificadores de aplicativo suportados em seu aplicativo à chave da lista de propriedades de informações
com.apple.developer.nfc.readersession.iso7816.select-identifiers .
Mas abaixo há uma restrição tão interessante: Nós apenas queremos "sentir", tendo aprendido o que exatamente significa. Adicione uma linha, por exemplo "Permitir conexão NFC" para a chave NFCReaderUsageDescription no arquivo info.plist . Ele também funciona com qualquer outro valor desta chave.
Important
Core NFC doesn't support payment-related Application IDs.

[Aqui, na coluna à esquerda, não a própria chave, mas sua descrição, o XCode oculta os nomes formais]
Em seguida, se quisermos interagir com o chip como com um dispositivo ISO / IEC 7816 , então no valor da chave com.apple.developer.nfc.readersession. iso7816.select-identifiers especificam a lista de IDs de todos os applets (Application Identifier ou AID), com os quais o aplicativo irá interagir.

Vale a pena esclarecer aqui que esses identificadores não são apenas um conjunto aleatório de caracteres.
São strings hexadecimais que contêm informações sobre o aplicativo ao qual estão atribuídos.
Os AIDs podem ter de 5 a 16 bytes (dois caracteres por linha = um byte). Eles consistem em duas partes, a primeira identifica o provedor do aplicativo (para Mastercard é "A000000004"), a segunda diz que tipo de produto é esse provedor (para um produto denominado "Mastercard" é "1010" e, por exemplo, para Maestro é "3060 ").
Além disso, às vezes é necessário inserir informações adicionais no AID, por exemplo, se houver dois aplicativos idênticos do mesmo provedor no chip, mas para bancos diferentes. Para isso, há suporte para Long AID (ou Extended AID). Contanto que o comprimento do AID não exceda 16 bytes, você pode escrever qualquer coisa nele. Por exemplo, pegamos Mastercard AID e no final adicionamos "TEST" a ele, o resultado: "A0000000041010BB5445535401".
O único AID que está fora da lista é "325041592E5359532E444446303101".
Na verdade, este é o usual (apenas em formato hexadecimal), como dizem, string de texto simples "2PAY.SYS.DDF01". Este é o AID PPSE, que não é um miniaplicativo de pagamento per se. Ele contém apenas os dados do ambiente exigidos pelos aplicativos de pagamento.
Instalando miniaplicativos
Para instalar miniaplicativos em um chip, você precisa de uma conexão segura (Secure Channel Protocol ou SCP); fizemos isso nos bastidores usando um leitor PC / SC convencional e a plataforma Cardsmobile TSM.
No entanto, mesmo se você não tiver nenhum desses, ainda pode tentar instalar seu próprio miniaplicativo em um chip - apenas um virtual.
Você precisará de qualquer IDE com suporte JCOP Shell e emulador JavaCard, por exemplo este .
Crie um projeto vazio, especifique o AID desejado (por exemplo, 0000000000) e execute.
Então entendemos as etapas:
- / card
Obter ATR, enviar SELECT sem ID para que o gerenciador de cartão seja selecionado;
- auth
, ;
- ls ()
, /;
- install [packageAID] [appletAID] [instanceAID]
:
packageAID — (Module), , «0000000000»
appletAID — (Load File), , «000000000000»
instanceAID — , , , «A0000000041010»;
- ls
, :
Na verdade, personalizar um miniaplicativo é muito simples; tudo o que é necessário é carregar os dados de pagamento exigidos nele. Para fazer isso, selecione o miniaplicativo com o comando SELECIONAR por seu AID, estabeleça uma conexão segura e envie ao miniaplicativo selecionado o comando STORE DATA com os dados dentro.
Agora, vamos voltar à lista de AIDs no arquivo info.plist - por que é necessário e como exatamente o Core NFC escolhe com qual miniaplicativo interagir?
Se parece com isso:
- O programa percorre a lista de cima para baixo;
- Para cada AID, ele gera e envia um comando SELECT;
- O AID do primeiro miniaplicativo que respondeu "9000" (o status de uma resposta bem-sucedida, aqui está uma lista de todas as respostas possíveis ) é registrado no campo initialSelectedAID de um objeto do tipo NFCISO7816Tag , que é colocado na matriz de chips detectados
@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 }
Além disso, você pode selecionar qualquer um desses objetos na matriz e usar o método sendCommand para enviar comandos APDU ao miniaplicativo selecionado.
Agora vamos falar sobre esta limitação:
Core NFC doesn't support payment-related Application IDs.
Ou seja, o Core NFC não suporta AIDs de pagamento, ou seja, combate AIDs com os quais os terminais de pagamento funcionam.
Claro, você pode adicionar um AID de pagamento à lista info.plist, mas o Core NFC irá ignorá-lo e não enviará um SELECT (a propósito, aqui está uma lista de todos os AIDs usados ). É assim que a Apple protege sua tecnologia Apple Pay, evitando que desenvolvedores terceiros acessem qualquer um dos recursos de pagamento do iPhone (e tudo relacionado a ele).
Soluções Alternativas
A primeira coisa que vem à mente é se é possível adicionar ao info.plist não o AID do miniaplicativo de pagamento, mas o AID Card Manager (Card Manager é um grupo de serviços dentro do sistema operacional do chip que gerencia o cartão, que são responsáveis pela administração e segurança), para que em seguida, enviar manualmente o comando SELECT com o AID do miniaplicativo desejado?
Aqui, encontramos a primeira armadilha - o Core NFC não permite o envio de um comando SELECT contendo um AID que não está registrado em info.plist .
Ok, adicionamos A0000000041010, mas isso também é uma falha - Core NFC não permite o envio de um comando SELECT contendo um AID de pagamento, independentemente de estar em info.plist ou não.
Vamos ver como funciona a restrição de ID.
Em info.plist, especificamos os seguintes AIDs:
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
Instalamos 14 miniaplicativos de pagamento com AIDs diferentes (itens 2-11 - AIDs de pagamento) e tentamos enviar os comandos SELECT do Gerenciador de Cartões com cada um desses AIDs.
Os números 12-15 responderam .
Acontece que a restrição é imposta a um determinado prefixo de AID, cuja presença determina se é um identificador de pagamento ou não.
É uma pena, mas esse método não é mais válido.
A segunda opção de personalização fornecida pela GlobalPlatform é o comando INSTALAR [para personalização].

É enviado ao Card Manager e contém o AID do applet que precisa ser personalizado.
Em seguida, você pode enviar comandos STORE DATA para o Card Manager, que os encaminhará para o aplicativo de destino.
Mas existe uma limitação. Para que um miniaplicativo ofereça suporte a esse tipo de personalização, ele deve implementar a interface org.globalplatform.Application .
Card Manager, ao comando INSTALAR [para personalização] com Mastercard Credit / Débito (Global) AID, que foi atribuído ao miniaplicativo M / Chip Advance da NXP , respondeu com o erro "6985" (Condições de uso não satisfeitas), o
que significa que você precisa verificar se ele implementa se é a interface do aplicativo .
Para fazer isso, escrevemos um aplicativo fictício simples que implementa essa interface. Como esperado, ele respondeu "9000" em INSTALAR [para personalização].
Porém, quando a Aplicação foi retirada das interfaces implementadas pela aplicação, passou a responder a este comando "6985", como é o caso do miniaplicativo M / Chip Advance.
Conseqüentemente, o problema é justamente que a aplicação NXP não implementa a interface necessária para tal forma de personalização. Este método também desaparece.
Tarefas adicionais
- Obtenção do UID do Chip
Isso pode ser feito de uma forma muito simples.
No início de uma sessão NFC , o módulo procura por chips, cujos AIDs de miniaplicativos estão registrados em info.plist, e os adiciona a um array.
Depois disso, você pode obter qualquer um deles de lá, e se o tipo for NFCISO7816Tag , então ele tem um campo identificador, que contém o UID do chip.
/** * @discussion The hardware UID of the tag. */ var identifier: Data { get }
- Obtendo um chip ATR
Mas parece que o Core NFC não pode receber ATR , porque não há ferramentas separadas para isso no framework, e você não pode obter ATR usando comandos APDU .
conclusões
O que há no resultado final?
- ISO/IEC 7816 ( UID), Core NFC;
- , Apple ;
- , , iPhone, , Application — ;
- , AID — .
Respondendo à pergunta feita no início, podemos dar ao usuário da Carteira a oportunidade de carregar seu cartão do banco no chaveiro anexando-o ao iPhone - não, isso ainda não é possível.
Como parte da tarefa, decidimos usar um leitor BLE externo para carregar um token de cartão bancário de um iPhone em um dispositivo passivo vestível.
Esperançosamente, no futuro, a Apple expandirá os recursos do NFC Core para realizar isso e uma série de outras tarefas de tokenização e pagamento em aplicativos de terceiros. No entanto, notícias recentes indicam que é improvável que isso aconteça em um futuro próximo.
Um efeito colateral do estudo
No decorrer do trabalho, surgiu um potencial esquema de fraude, que não pode ser reproduzido em smartphones Apple, mas é perfeitamente possível implementá-lo através de um smartphone Android com suporte NFC e tecnologia Host Card Emulation.
O resultado final é:
- o primeiro smartphone será usado como terminal, ou seja, ele se conectará a cartões bancários e interagirá com seus miniaplicativos de pagamento,
- o segundo smartphone - como meio de pagamento (na finalização da compra parecerá um pagamento normal com smartphone).
Usando este esquema, você pode criar um cartão de banco de rede - smartphone - smartphone - terminal de pagamento, a saber:
- O primeiro smartphone é anexado a qualquer cartão de banco;
- O segundo é aplicado ao terminal de pagamento;
- O segundo smartphone emula um cartão de banco enviando comandos APDU enviados pelo terminal para o primeiro smartphone;
- O primeiro smartphone transmite esses comandos para o cartão do banco anexado, transmitindo suas respostas para o segundo smartphone;
- O segundo smartphone transmite as respostas recebidas ao terminal;
- O pagamento foi feito.
Ou seja, potencialmente um fraudador pode colocar um smartphone no bolso e pagar a compra. Seja cuidadoso!
Para evitar ser vítima de tal esquema fraudulento, você pode, por exemplo, transferir cartões bancários para o seu smartphone e não carregar plástico com você.
Em vez de uma conclusão
Procurei escrever o artigo em uma linguagem simples, sem me aprofundar muito na terminologia da área temática. Nele, descrevi um dos projetos inovadores em que estamos trabalhando, a área de assunto e um pequeno estudo dos novos recursos do framework iOS Core NFC.
Qualquer feedback é bem-vindo: perguntas, críticas, comentários, acréscimos, críticas construtivas.
Links Úteis
Se você estiver interessado no tópico descrito no artigo, abaixo estão vários links para um estudo mais detalhado:
- Livro de I. M. Goldovsky " Cartões de microprocessador bancário "
- Conceito de tokenização de pagamento EMV
- Artigos com análise do mercado de IoT: