API Java
HSM Dinamo
|
Operações para Transferência Eletrônica de Fundos.
As APIs do módulo EFT (Eletronic Funds Transfer) são destinadas às operações de autenticação e verificação de identidade de usuários em transações com cartões Visa e Mastercard.
A identidade do usuário de cartão normalmente pode ser verificada de duas formas:
Os padrões adotados estão em conformidade com o Manual de Padrões de Tecnologia de Pagamentos da Visa (Payment Technology Standards Manual, October 2007).
De forma genérica, o processo de transferência de fundos com cartão, segue o fluxo da figura abaixo. Há vários atores envolvidos no processo. O portador do cartão (card holder) o apresenta ao lojista (Retailer/Merchant), a autenticidade do portador pode ser verificada através de um PIN, que o portador digita na estação do lojista (por exemplo um terminal tipo POS, Point of Sale). A partir daí o PIN é cifrado (é gerado um PIN Block) e os dados da transação são enviados para um prestador de serviços de pagamento eletrônicos, contratado pelo lojista (Acquirer), que por sua envia os dados para o esquema de cartão correspondente, conforme o brand do cartão usado pelo portador, e daí é enviado para o emissor do cartão, que tem os dados de identificação, crédito e outros a respeito do portador e mantém contrato com este para uso do serviço. Após analisar os dados da transação, quanto á cadastro, crédito e autenticação, entre outros, o emissor pode autorizar ou recusar a transação, e esta mensagem de resposta percorre o fluxo no sentido inverso.
Do ponto de vista das chaves de criptografia usadas no processo, o processo é mostrado na figura abaixo. Cada ator mantém suas próprias chaves, e sempre que uma mensagem criptografada precisa ir de um ator para outro, a criptografia deve ser traduzida, ou seja, deve ser usada a chave correspondente do ator que deverá fazer a decriptografia da mensagem.
Variações ou simplificações do esquema acima podem ser usados, por exemplo quando a mesma entidade tem mais de um papel, ou há uma comunicação direta do prestador (acquirer) com o emissor (issuer), como pode acontecer em certas transações de débito em conta.
Sobre o suporte ao algoritmos do protocolo 3-D Secure:
O HSM Dinamo implementa os algoritmos criptográficos que suportam o protocolo 3-D Secure, desenvolvido pela Visa. Os serviços Verified by Visa da Visa e Secure Code da Mastercard são oferecidos pelas bandeiras baseados neste protocolo. O HSM implementa os algoritmos criptográficos de verificação de cartão que dão suporte ao protocolo e aos serviços, permitindo ao usuário do HSM fazer a geração e a verificação dos códigos, CVC2 (Card Verification Code 2) e HMAC SHA1 no caso da Mastercard (Secure Payment Application Algorithm) e CAVV (Cardholder Authentication Verification Value, CVV2 com método ATN) no caso da Visa.
O HSM possui suporte aos mecanismos de autenticação CAP (Visa) e DPA (Mastercard).
O HSM fornece suporte ao ATM Remote Key Loading/Transport através de funcionalidades criptográficas baseadas em funções RSA e X.509.
A implementação do HSM está de acordo com os padrões definidos na documentação listada abaixo:
EMVCo
Visa
Mastercard
Elo
JCB
Outros
Há três formas de geração e verificação de CVV (Card Verification Value) no HSM:
A chave usada para os cálculos de geração e verificação de CVV é denominada CVK (Card Verification Key). Esta chave é interna ao HSM, a aplicação precisa apenas informar seu nome de chave (id). Fisicamente é uma chave 3DES de 112 bits, o que corresponde à duas chaves de DES de 56 bits.
A Figura abaixo ilustra os esquema para geração e verificação de CVV, iCVV e CVV2.
O HSM trabalha com geração de PIN (Personal Identification Number) por mecanismo de derivação, a partir de uma chave interna, denominada PGK (PIN Generation Key). Esta forma de geração tem várias vantagens, principalmente em relação ao método de geração de PIN com valores aleatórios, pois dispensa o uso de um banco de dados para validação (com provável exposição de dados sigilosos) e ainda mantém tanto o processo de geração quanto de validação, mais seguros, já que são realizados internamente ao HSM.
O padrão utilizado na geração de PIN pelo HSM é o IBM 3624, com o emprego de offsets para permitir a troca de PIN pelo usuário ou pelo emissor do cartão. Para mitigar ataques de decimalização e verificação, o HSM emprega uma tabela de conversão interna, não exposta para a aplicação. Como fator de segurança adicional é empregado uma chave 3DES de 168 bits, ao invés de uma 3DES de 112 bits; não há interferência na operação do algoritmo, já que as chaves DES e 3DES utilizam blocos de entrada e saída do mesmo tamanho.
Estão definidos três modos de geração de PIN por derivação:
Não há tratamento para regras de negócio dos PIN gerados dentro do HSM, tal função deve ser exercida pela aplicação chamadora.
Os algoritmos para geração usando o padrão IBM 3624 são mostrados nos diagramas abaixo.
Para permitir que o usuário (cardholder) selecione o próprio PIN, um PIN offset é usado no método IBM 3624, com isso duas novas entradas são necessárias, o PIN definido pelo usuário e um check de tamanho de 4 bits. A operação com offset é realizada após os passos do algoritmo IBM 3624, mostrado acima. Com isso o processo interno do HSM consegue realizar a validação do PIN, mesmo que o usuário defina um PIN diferente daquele gerado inicialmente pelo HSM.
As operações de tradução de PIN Block (PIN Block Translate) funcionam com duas chaves, uma de origem e uma de destino; há uma fase intermediária para compatibilizar o formato de entrada ao formato de saída, caso seja possível. Há certos formatos de blocos que não são interoperáveis, ou por ausência de dados para a conversão ou por restrição da norma.
O modo de tradução default do HSM implica na tradução do bloco de entrada para o formato ISO PIN Block Format 0. No modo de tradução automático, a conversão é realizada de forma opaca, convertendo do bloco com a chave de origem para o bloco com a chave de destino, sem análise do formato ou conteúdo do bloco.
Na verificação de um PIN Block ocorrem duas operações com chaves, primeiro o PIN Block é decifrado com a chave PTK (PIN Transport Key), do bloco do PIN decifrado, é extraído o PIN, e a partir daí é realizada a verificação de PIN usando a PGK (PIN Generation Key, a mesma chave utilizada para a geração original do PIN). Esta verificação pode ser feita com ou sem o uso de um offset; este PIN offset não faz parte do PIN Block e não é criptografado pela PTK. O formato de PIN Block esperado é o ISO PIN Block Format 0 (equivalente ao ANSI PIN Block Format 0 e ao VISA PIN Block Format 1).
DUKPT (Derived Unique Key Per Transaction) é uma forma de utilizar chaves únicas por transação, derivadas a partir de uma chave fixa, sendo este processo definido na ANSI X9.24 part 1.
A KSN (Key Serial Number) é o identificador de uma chave de transação, sendo dividida em partes como: KSI (Key Set ID), TRSM (Tamper Resistant Security Module), identificador do POS (Point of Sale) também conhecido como DID (Device ID) e o CTR (Transaction Counter).
O HSM utiliza as partes da KSN separadas em KSI e DID + CTR cada uma contendo 5 bytes.
Os passos do processo de utilização de DUKPT são, em cada ponta da comunicação:
No POS:
No HSM:
É um processo de wrapping/_unwrapping_ com proteção de confidencialidade e integridade para chaves e dados associados, definido no documento ASC X9 TR 31-2018.
KBPK (Key Block Protection Key) é a chave de derivação utilizada para derivar as chaves de encriptação e autenticação. Esta chave é utilizada apenas para derivação. Também conhecida como KWK (Key Wrapping Key). Armazenada no HSM.
KBEK (Key Block Encryption Key) é a chave derivada da KBPK e usada apenas para a encriptação do key klock. Gerada a cada operação de wrap/unwrap, não é armazenada de forma persistente no HSM.
KBAK (Key Block Authentication Key) é a chave derivada da KBPK e usada apenas para o cálculo do MAC do key klock. Gerada a cada operação de wrap/unwrap, não é armazenada de forma persistente no HSM.
KDID (Key Derivation Input Data) são os dados utilizados para a derivação das chaves KBEK e KBAK. Contém dados como: counter, key usage indicator, algorithm indicator e tamanho. Varia de acordo com o método de derivação utilizado, chave que será derivada e demais parâmetros.
A derivação das chaves KBEK e KBAK utiliza o CMAC tendo como entrada o Key Derivation Input Data (específico de cada chave derivada) e a chave KBPK.
Key block contém os dados da chave exportada. Este bloco é divido em 3 partes:
Funções | |
String | generateDUKPT (byte[] baKSI, byte[] baDID_CTR, int dwParam) throws TacException |
Gera uma chave DUKPT dentro do HSM utilizando uma KSI (Key Serial Identification), um DID (Device ID) e um CTR (Transaction Counter) de uma mesma KSN (Key Serial Number). | |
String | generateDUKPTName (byte[] baKSI, byte[] baDID_CTR) throws TacException |
Gera o nome da DUKPT a partir de uma KSI e CTR informados. | |
String | generateBDKName (byte[] baKSI) throws TacException |
Gera o nome da BDK a partir de uma KSI (Key Serial Identification). | |
byte[] | translatePINBlock (String srcPEK, String dstPEK, int transBlockType, String PAN, byte[] inPINBlock) throws TacException |
Faz a tradução de um PIN Block, decriptando o bloco com uma chave e encriptando com outra. | |
byte[] | exportTR31 (String kbpk, String key, int usage, byte mode, byte export) throws TacException |
Exporta uma chave no formato TR-31 de acordo com o padrão ASC X9 TR 31-2018. | |
void | importTR31 (String kbpk, String key, int keyAttributes, byte[] keyBlock) throws TacException |
Importa uma chave no formato TR-31 de acordo com o padrão ASC X9 TR 31-2018. | |
String generateDUKPT | ( | byte[] | baKSI, |
byte[] | baDID_CTR, | ||
int | dwParam ) throws TacException |
Gera uma chave DUKPT dentro do HSM utilizando uma KSI (Key Serial Identification), um DID (Device ID) e um CTR (Transaction Counter) de uma mesma KSN (Key Serial Number).
baKSI | Buffer de tamanho TacNDJavaLib.MIN_KSI_LEN contendo o KSI (primeiros 05 bytes do KSN). | ||||||||||||||
baDID_CTR | Buffer de tamanho TacNDJavaLib.MIN_CTR_LEN contendo o DID e CTR (últimos 05 bytes do KSN). | ||||||||||||||
dwParam | Flags de operação de acordo com a tabela abaixo.
|
TacException |
String generateDUKPTName | ( | byte[] | baKSI, |
byte[] | baDID_CTR ) throws TacException |
Gera o nome da DUKPT a partir de uma KSI e CTR informados.
baKSI | Buffer de tamanho TacNDJavaLib.MIN_KSI_LEN contendo o KSI (primeiros 05 bytes do KSN). |
baDID_CTR | Buffer de tamanho TacNDJavaLib.MIN_CTR_LEN contendo o DID e CTR (últimos 05 bytes do KSN). |
TacException |
String generateBDKName | ( | byte[] | baKSI | ) | throws TacException |
Gera o nome da BDK a partir de uma KSI (Key Serial Identification).
baKSI | Buffer de tamanho TacNDJavaLib.MIN_KSI_LEN contendo o KSI (primeiros 05 bytes do KSN). |
TacException |
byte[] translatePINBlock | ( | String | srcPEK, |
String | dstPEK, | ||
int | transBlockType, | ||
String | PAN, | ||
byte[] | inPINBlock ) throws TacException |
Faz a tradução de um PIN Block, decriptando o bloco com uma chave e encriptando com outra.
O formato de bloco de entrada é identificado automaticamente, e o formato de bloco de saída pode ser definido pelo chamador, desde que a troca do formato não seja de um PAN Unbound para um PAN Bound. Os formatos PAN Bound são aqueles que utilizam informação de PAN em sua composição. É possível, portanto, realizar tanto tradução de chaves quanto tradução de formato. O chamador pode fazer uma validação forçada do formato indicando para o formato de saída, o mesmo que está usando no PIN Block de entrada.
srcPEK | Identificador da chave de decriptação dentro do HSM. | ||||||||||||
dstPEK | Identificador da chave de encriptação dentro do HSM. | ||||||||||||
transBlockType | Identificador do formato do bloco de saída. De acordo com a tabela abaixo.
| ||||||||||||
PAN | PAN (Primary Account Number). | ||||||||||||
inPINBlock | PIN Block de entrada. O buffer deve ter o tamanho de um PIN Block, TacNDJavaLib.DES_BLOCK (8 bytes) |
TacException |
byte[] exportTR31 | ( | String | kbpk, |
String | key, | ||
int | usage, | ||
byte | mode, | ||
byte | export ) throws TacException |
Exporta uma chave no formato TR-31 de acordo com o padrão ASC X9 TR 31-2018.
kbpk | Nome da chave KBPK (Key Block Protection Key) utilizada para derivar as chaves de encriptação e autenticação. | ||||||||||||||||||||||||||
key | Nome da chave que será exportada do HSM. | ||||||||||||||||||||||||||
usage | Identificador de uso de chave, como descrito no ASC X9 TR 31-2018 Seção A.5.1 tabela 6. As seguintes opções são aceitas. | ||||||||||||||||||||||||||
mode | Identificador do modo de uso da chave, como descrito no ASC X9 TR 31-2018 Seção A.5.3 tabela 8. As seguintes opções são aceitas.
| ||||||||||||||||||||||||||
export | Identificador de exportabilidade da chave, como descrito no ASC X9 TR 31-2018 Seção A.5.5 tabela 10. As seguintes opções são aceitas.
|
TacException |
Algoritmo da KBPK | Método de exportação |
---|---|
3DES | 5.3.2.1 Key Derivation Binding Method - TDEA |
AES | 5.3.2.3 Key Block Binding Method – AES |
void importTR31 | ( | String | kbpk, |
String | key, | ||
int | keyAttributes, | ||
byte[] | keyBlock ) throws TacException |
Importa uma chave no formato TR-31 de acordo com o padrão ASC X9 TR 31-2018.
kbpk | Nome da chave KBPK (Key Block Protection Key) utilizada para derivar as chaves de encriptação e autenticação. |
key | Nome da chave que será importada no HSM. |
keyAttributes | Parâmetros adicionais da chave. Veja as opções no método createKey(). |
keyBlock | key block |
TacException |
Algoritmo da KBPK | Método |
---|---|
3DES | 5.3.2.1 Key Derivation Binding Method - TDEA |
AES | 5.3.2.3 Key Block Binding Method – AES |