ID TECH
Contato
Todos os posts técnicos

Post Técnico

Anatomia de um Comando MAC

Muitos clientes da ID TECH têm interesse em criptografia ponto a ponto (P2PE)e, como parte de sua busca pela conformidade com as rigorosas regras de P2PE do PCI, frequentemente consideram o uso de dispositivos de pagamento SRED (Secure Reading and Exchange of Data). 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 violação, zeroização automática de dados em caso de adulteraçã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 é enviada em texto claro, mas também é enviado o conjunto 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 verificável (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ê queira definir a data e a hora em um leitor de cartão Augusta S da ID TECH, que é um dispositivo SRED. O comando "Definir Data e Hora" é considerado sensível, pois uma parte não autorizada não deveria ter permissão para retrodatar (ou de outra forma alterar) transações. (Outros comandos "sensíveis" incluem, por exemplo, comandos que adicionam ou removem cartões de uma lista de permissões, ou que modificam a Lista de Revogação de Certificados do dispositivo.)

Normalmente, para definir a data e a hora de um Augusta sem SRED, utiliza-se o comando de firmware 78 53 01 50, seguido do comprimento do payload (0x08), depois o comprimento da data/hora (0x06), depois os seis bytes de data e hora no formato AA MM DD HH MM SS, seguido pelo "comprimento do MAC," que (em um dispositivo sem 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, no Augusta, o comando completo 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. A versão MAC final do comando completo é a seguinte (com os bytes de 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 a estrutura seção por 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 (Definir Data e Hora).

26 (hexadecimal) indica que 38 bytes de payload se seguem.

06 indica que a data/hora é composta por 6 bytes, a saber:

17 11 10 09 15 00 — 10 de novembro de 2017, às 09h15min00s.

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 (LRC).

F9 é o checksum de 8 bits de tudo, desde 78 até ao byte final do KSN (02).

03 é o ETX (fim de transmissão).

Construir este comando não apresenta nenhuma dificuldade particular. As partes que não se explicam por si mesmas são o KSN e o HMAC (o próprio hash).

MAC KSN

O MAC KSN (Número de Série da Chave) é um valor que deve ser consultado diretamente no dispositivo no momento em que for necessário. Se você já conhece o ANSI X9.24-1 (o padrão de Chave Única Derivada por Transação), sabe que o KSN é um valor de 10 bytes no qual os 21 bits inferiores constituem um contador que é incrementado após cada uso. O que talvez 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 pode ser consultado a qualquer momento. No Augusta da ID TECH, o MAC KSN pode ser obtido com o comando (completo e formatado) 02090078463e040005010000000603.

O KSN é fundamental, pois faz parte do cálculo da chave MAC, que é única por uso (e, portanto, não está sujeita a ataques de repetição). Para mais informações sobre KSNs e derivação de chaves DUKPT, consulte minha publicação anterior em duas partes sobre o assunto.

DERIVAÇÃO DO HMAC

Agora vem a parte mais técnica.

O HMAC (consulte a RFC 2104) é uma forma amplamente aceita pela indústria para a criação de hashes MAC utilizando:

  • — uma chave descartável de 128 bits
  • — uma carga de mensagem arbitrária
  • — hash SHA-256

A chave em questão é derivada dinamicamente por meio do MAC KSN e do IPEK do dispositivo (que, por sua vez, deriva de um BDK), de acordo com as regras padrão do DUKPT. Essas regras determinam uma forma específica de derivação de chave MAC (em oposição a uma chave de dados ou chave PIN). Tudo isso está descrito em minha publicação anterior em duas partes

O temido 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-linha) 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.

K' ⊕ ipad significa combinar a chave com preenchimento de zeros com o valor ipad, usando OU exclusivo (também conhecido como XOR), que é uma operação aritmética bit a bit muito apreciada pelos entusiastas de ciência da computação.

K' ⊕ ipad) ‖ m significa anexar a mensagem (m) ao valor obtido acima. Basta adicionar os bytes ao final. (O comprimento será superior a 64 bytes a partir deste 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ê vai anexar o resultado a K' ⊕ opad, onde opad (the outer pad) é uma constante formada por 5C5C5C5C… repetida até atingir 64 bytes. Em seguida, todo o valor é submetido a um novo processo de hash.

Caso esteja se perguntando, os valores de 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 duas metades, de forma aninhada, a fim de prevenir diversas formas de falsificação.

Para auxiliar 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 HMAC para criar um hash MAC de 32 bytes (via SHA-256). Não deixe de experimentar a opção "Generate HMAC (with verbose output)" no menu suspenso no topo do formulário. Você obterá um rastreamento detalhado e muito útil que explica, de forma clara e objetiva, como cada elemento do processo 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 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 do payload em texto simples e, usando seu próprio KSN e o código interno de derivação de chaves, chegará ao mesmo valor HMAC que você incluiu no comando — confirmando que o comando deve ter originado de uma fonte que conhece a BDK secreta (0123456789ABCDEFFEDCBA9876543210); ou seja, uma fonte confiável.

Tem dúvidas sobre DUKPT? HMAC? SRED? P2PE? Entre em contato com nossos especialistas. Estamos aqui para ajudar:

Número Gratuito
1-800-984-1010