Post Técnico
Anatomia de um Comando MAC
Muitos clientes da ID TECH têm interesse em criptografia ponto a ponto (P2PE)e, em sua busca pela conformidade com as rigorosas regras de P2PE do PCI, frequentemente consideram SRED (Secure Reading and Exchange of Data) dispositivos de pagamento. Esses dispositivos não apenas criptografam os dados no momento da captura (como todos os dispositivos da ID TECH são capazes de fazer), mas também incorporam detecção de adulteração, zeroização automática de dados em caso de violação e outros recursos de segurança especializados.
Entre os "outros recursos de segurança especializados", destaca-se o que é conhecido como autenticação MAC de comandos.
Em criptografia, um código de autenticação de mensagem (MAC) é um código curto utilizado para permitir que o destinatário de uma mensagem a autentique — ou seja, confirme que ela foi enviada por um remetente confiável. O valor do MAC protege tanto a integridade dos dados da mensagem quanto sua autenticidade, combinando a mensagem com um segredo conhecido tanto pelo remetente quanto pelo destinatário. A mensagem é transmitida em texto claro, mas também é enviada a combinação mensagem mais MAC (que contém o segredo criptografado). Qualquer pessoa que possua o segredo pode verificar se a mensagem (e seu conteúdo MAC adicional) foi enviada por alguém com acesso ao mesmo segredo.
Nos leitores de cartão baseados em SRED da ID TECH, determinados comandos sensíveis são protegidos por MAC, o que significa que o dispositivo não executará o comando a menos que ele venha acompanhado de um hash MAC que possa ser verificado (utilizando uma chave já armazenada no dispositivo). O remetente do comando deve construir o hash MAC usando a mesma chave que o dispositivo utilizará para validá-lo.
Um exemplo pode tornar isso mais claro.
Suponha que você deseja definir a data e hora em um leitor de cartão ID TECH Augusta S, que é um dispositivo SRED. O comando "Set Date and Time" é considerado sensível, pois uma parte não autorizada não deve ter permissão para retroagir datas (ou de outra forma alterar) transações. (Outros comandos "sensíveis" incluem, por exemplo, comandos que adicionam ou removem cartões de uma lista branca, ou que modificam a Lista de Revogação de Certificados do dispositivo.)
Normalmente, você definiria a data e hora de um Augusta não SRED usando o comando de firmware 78 53 01 50, seguido pelo comprimento do payload (0x08), depois o comprimento da data/hora (0x06), seguido pelos seis bytes de data e hora, no formato AA MM DD HH MM SS, e por fim o "comprimento do MAC", que (para um dispositivo não SRED) é zero. No Augusta S, a fórmula acima é a mesma, exceto que o comprimento do payload é 0x26 e o "comprimento do MAC" é 0x1E, pois 30 bytes extras de "payload MAC" são acrescentados ao final de tudo.
Naturalmente, com o Augusta, todo o comando precisa ser formatado no protocolo NGA da ID TECH, o que consiste em adicionar STX (0x02) e dois bytes de comprimento em little-endian no início da estrutura do comando, além de LRC, checksum e ETX (0x03) no final da estrutura do comando. A versão MAC final do comando completo tem a seguinte aparência (com os bytes do comando destacados em amarelo):
02 2B 00 78 53 01 50 26 06 17 11 10 09 15 00 1E 10 00 4E C7 DF CF 04 D3 3C C6 EC 6F 50 92 00 86 A1 DD 0A 00 62 99 49 00 00 00 00 00 00 02 EB F9 03
Vamos analisar cada seção:
02 é o STX.
2B 00 é o comprimento (em little-endian) de toda a estrutura, excluindo o trailer LRC/checksum/ETX.
78 53 01 50 é o comando de firmware Set Date and Time.
26 (hexadecimal) indica que 38 bytes de payload se seguem.
06 indica que a data/hora consiste em 6 bytes, a saber:
17 11 10 09 15 00 — 10 de novembro de 2017, 09:15:00 AM.
1E significa que 30 bytes de payload MAC se seguem.
10 00 é um valor de comprimento little-endian de 16 (porque todos os hashes MAC da ID TECH têm 16 bytes de comprimento).
4E C7 DF CF 04 D3 3C C6 EC 6F 50 92 00 86 A1 DD é o hash MAC de 16 bytes, ou "HMAC."
0A 00 é um comprimento little-endian de 10, referente ao KSN que se segue.
62 99 49 00 00 00 00 00 00 02 é o KSN do MAC.
EB é o valor de Verificação de Redundância Longitudinal.
F9 é o checksum de 8 bits de tudo, desde 78 até o byte final do KSN (de 02).
03 é ETX (fim de transmissão).
Não há nada particularmente difícil na construção deste comando. As partes que não são autoexplicativas são o KSN e o HMAC (o próprio hash).
MAC KSN
O MAC KSN (Número de Série da Chave) é algo que você precisa consultar no dispositivo no momento em que necessitar dele. Se você estiver familiarizado com ANSI X9.24-1 (o padrão de Chave Única Derivada por Transação), você sabe que o KSN é um valor de 10 bytes no qual os 21 bits inferiores constituem um contador que é incrementado a cada uso. O que talvez você não tenha percebido é que, se um dispositivo contiver múltiplas chaves DUKPT (para Dados, MAC e PIN, por exemplo), cada uma terá seu próprio KSN dedicado, que é incrementado de forma independente das demais. O KSN é um valor público, e você pode consultá-lo — especificamente o MAC KSN no Augusta do ID TECH — com o comando (completo e formatado) 02090078463e040005010000000603, a qualquer momento.
O KSN é importante porque faz parte do cálculo da chave MAC, que é única por uso (portanto, não sujeita a ataques de repetição). Para mais informações sobre KSNs e derivação de chaves DUKPT, consulte minha postagem anterior em duas partes sobre o assunto.
DERIVAÇÃO DE HMAC
Agora vem a parte técnica.
HMAC (consulte RFC 2104) é uma forma aceita pelo setor de criar hashes MAC utilizando:
- — uma chave temporária de 128 bits
- — um payload de mensagem arbitrário
- — hashing SHA-256
A chave em questão é derivada dinamicamente, utilizando o MAC KSN e o IPEK do dispositivo (que, por sua vez, deriva de um BDK), conforme as regras padrão do DUKPT. Essas regras definem uma forma específica de derivar uma chave MAC (em contraposição a uma chave de dados ou chave PIN). Tudo isso está descrito em minha publicação anterior em duas partes
O temível hash HMAC é calculado de acordo com a seguinte fórmula de aparência assustadora:
H( (K' ⊕ opad) ‖ H( (K' ⊕ ipad) ‖ m) )
Não se deixe intimidar por isso. Na verdade, é bastante compreensível. O valor K é a chave de 128 bits. K' (k-prime) representa essa mesma chave, preenchida com zeros até atingir um comprimento total de 64 bytes.
O ipad (inner pad) é simplesmente a constante 36363636… repetida até atingir 64 bytes de comprimento.
K' ⊕ ipad significa combinar a chave preenchida com zeros com o valor ipad, utilizando a operação OU exclusivo (também conhecida como XOR), uma operação aritmética bit a bit muito apreciada pelos entusiastas de ciência da computação.
K' ⊕ ipad) ‖ m significa concatenar a mensagem (m) ao valor obtido acima. Basta adicionar os bytes ao final. (O comprimento será superior a 64 bytes nesse ponto. Não se preocupe com isso.)
H( (K' ⊕ ipad) ‖ m) significa aplicar a função de hash (neste caso, SHA-256) a todo o valor entre parênteses.
Ao concluir essa etapa, você concatenará o resultado a K' ⊕ opad, onde opad (o pad externo) é uma constante formada por 5C5C5C5C… repetida até atingir 64 bytes de comprimento. Em seguida, você aplicará novamente a função de hash a todo o conjunto.
Caso você esteja se perguntando, os valores ipad e opad foram escolhidos (pelos autores originais deste algoritmo) de forma arbitrária, mas de maneira a maximizar a distância de Hamming (ou diferenças bit a bit) entre as metades anterior e posterior do hash. O hash é realizado em metades, de forma aninhada, para evitar diversas formas de falsificação.
Para auxiliá-lo na criação de valores HMAC, a ID TECH disponibilizou um formulário HTML online aqui, no qual você pode inserir os valores de KSN e BDK (chave raiz), derivar sua chave MAC e usar o HMAC para criar um hash MAC de 32 bytes (via SHA-256). Certifique-se de experimentar a opção "Generate HMAC (with verbose output)" no menu suspenso no topo do formulário. Você obterá um rastreamento detalhado e bastante útil que explica, com absoluta clareza, como cada parte do quebra-cabeça do HMAC se apresenta.
Se você utilizar nossa ferramenta online para gerar uma chave MAC com um KSN de 62 99 49 00 00 00 00 00 00 02 e uma chave raiz (BDK) de 0123456789ABCDEFFEDCBA9876543210 — que é a chave de teste padrão ANSI —, sua chave MAC deverá ter o valor 3E4A480ACE8B239B9539E6053EAB03D9. Se você aplicar o algoritmo HMAC a um payload de 78 53 01 50 26 06 17 11 10 09 15 00 1E 10 00 usando essa chave, o resultado deverá ser um hash HMAC de 32 bytes, cujos primeiros 16 bytes são 4EC7DFCF04D33CC6EC6F50920086A1DD. (A ID TECH utiliza apenas os primeiros 16 bytes.) Esta é a "impressão digital" especial que será adicionada ao comando Set Date and Time. O leitor de cartão analisará os bytes de payload em texto claro e, usando seu próprio KSN e código interno de derivação de chave, chegará ao mesmo valor HMAC incluído no seu comando, verificando que o comando deve ter partido de uma fonte que conhece a BDK especial (0123456789ABCDEFFEDCBA9876543210) — portanto, uma fonte confiável.
Tem dúvidas sobre DUKPT? HMAC? SRED? P2PE? Entre em contato com nossos especialistas. Estamos aqui para ajudar:
