ID TECH
Contacto
Todos los artículos técnicos

Publicación técnica

Anatomía de un comando MAC

A muchos clientes de ID TECH les interesa el cifrado punto a punto (P2PE)y, como parte de su objetivo de cumplir con las estrictas normas P2PE de PCI, a menudo consideran SRED (Secure Reading and Exchange of Data)), dispositivos de pago. Estos dispositivos no solo cifran los datos en el momento de la captura (como hacen todos los dispositivos de ID TECH), sino que también incorporan detección de manipulación, eliminación automática de datos en caso de manipulación y otras funciones de seguridad especializadas.

La principal de esas «otras funciones de seguridad especializadas» es lo que se conoce como autenticación MAC de comandos.

En criptografía, un código de autenticación de mensajes (MAC) es un código corto que permite al receptor de un mensaje autenticarlo; es decir, confirmar que el mensaje proviene de un remitente de confianza. El valor MAC protege tanto la integridad de los datos del mensaje como su autenticidad, combinando el mensaje con un secreto conocido tanto por el remitente como por el receptor. El mensaje se envía en claro, pero también se envía el mensaje junto con el MAC (que contiene el secreto, cifrado). Cualquiera que posea el secreto puede determinar si el mensaje (y su contenido MAC adicional) procede de otra persona con acceso al mismo secreto.

En los lectores de tarjetas basados en SRED de ID TECH, ciertos comandos sensibles están protegidos por MAC, lo que significa que el dispositivo no ejecutará el comando a menos que venga acompañado de un hash MAC verificable (utilizando una clave ya almacenada en el dispositivo). El emisor del comando debe generar el hash MAC con la misma clave que el dispositivo usará para validarlo.

Un ejemplo puede ayudar a aclararlo.

Supongamos que desea ajustar la fecha y la hora en un lector de tarjetas ID TECH Augusta S, que es un dispositivo SRED. El comando «Set Date and Time» se considera sensible, ya que no debería permitirse que una parte no autorizada anteceda (o altere de cualquier otro modo) las transacciones. (Otros comandos «sensibles» incluyen, por ejemplo, los que añaden o eliminan tarjetas de una lista blanca o los que modifican la Lista de Revocación de Certificados del dispositivo).

Normalmente, en un Augusta no SRED se establecerían la fecha y la hora con el comando de firmware 78 53 01 50, seguido de la longitud de la carga útil (0x08), la longitud de fecha/hora (0x06), los seis bytes de fecha y hora en formato YY MM DD HH MM SS, y la «longitud MAC», que (para un dispositivo no SRED) es cero. En Augusta S, la fórmula anterior es la misma, salvo que la longitud de la carga útil es 0x26 y la «longitud MAC» es 0x1E, ya que se añaden 30 bytes adicionales de «carga útil MAC» al final del conjunto.

Naturalmente, en Augusta el comando completo debe formatearse según el protocolo NGA de ID TECH, lo que implica colocar STX (0x02) y dos bytes de longitud en little-endian al inicio de la estructura del comando, y LRC, checksum y ETX (0x03) al final. La versión MAC final de todo el comando queda así (con los bytes de comando en amarillo):

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 a desglosarlo, sección por sección:

02 es STX.

2B 00 es la longitud (en little-endian) de toda la estructura, sin contar el cierre con LRC/checksum/ETX.

78 53 01 50 es el comando de firmware Set Date and Time.

26 (hex) indica que siguen 38 bytes de carga útil.

06 indica que la fecha/hora consta de 6 bytes, a saber:

17 11 10 09 15 00 — 10 de noviembre de 2017, 09:15:00.

1E indica que siguen 30 bytes de carga útil MAC.

10 00 es un valor de longitud en little-endian igual a 16 (ya que todos los hashes MAC de ID TECH son de 16 bytes).

4E C7 DF CF 04 D3 3C C6 EC 6F 50 92 00 86 A1 DD es el hash MAC de 16 bytes, o «HMAC».

0A 00 es una longitud en little-endian de 10, correspondiente al KSN que sigue.

62 99 49 00 00 00 00 00 00 02 es el KSN MAC.

EB es el valor de Longitudinal Redundancy Check.

F9 es el checksum de 8 bits de todo el contenido desde 78 hasta el último byte del KSN (02).

03 es ETX (fin de transmisión).

Construir este comando no tiene especial dificultad. Las partes que no se explican por sí mismas son el KSN y el HMAC (el propio hash).

KSN MAC

El KSN MAC (Key Serial Number) es algo que debe consultar al dispositivo en el momento en que lo necesite. Si está familiarizado con ANSI X9.24-1 (el estándar Derived Unique Key Per Transaction), sabrá que el KSN es un valor de 10 bytes en el que los 21 bits inferiores constituyen un contador que se incrementa después de cada uso. Lo que quizá no haya notado es que, si un dispositivo contiene varias claves DUKPT (para Datos, MAC y PIN, por ejemplo), cada una tendrá su propio KSN dedicado que se incrementa de forma independiente respecto a los demás. No obstante, el KSN es un valor público, y en el Augusta de ID TECH puede consultar el KSN del MAC en cualquier momento mediante un comando (completo y formateado) 02090078463e040005010000000603.

El KSN es importante, ya que forma parte del cálculo de la clave MAC, que es única por uso (y, por tanto, no es vulnerable a ataques de repetición). Para más información sobre los KSN y la derivación de claves DUKPT, consulte mi anterior publicación en dos partes sobre el tema.

DERIVACIÓN DE HMAC

Ahora viene la parte más técnica.

HMAC (consulte RFC 2104) es un método aceptado por la industria para crear hashes MAC utilizando:

  • — una clave de un solo uso de 128 bits
  • — una carga útil de mensaje arbitraria
  • — hashing SHA-256

La clave en cuestión se deriva dinámicamente utilizando el KSN del MAC y el IPEK del dispositivo (que a su vez se deriva de una BDK), conforme a las reglas estándar de DUKPT. Estas reglas establecen una forma concreta de derivar una clave MAC (distinta de una clave de datos o de PIN). Todo ello se describe en mi anterior publicación en dos partes

El temible hash HMAC se calcula según la siguiente fórmula, aparentemente intimidante:

H( (K' ⊕ opad) ‖ H( (K' ⊕ ipad) ‖ m) )

No se desanime. En realidad es bastante comprensible. El valor K es la clave de 128 bits. K' (k-prima) representa esa misma clave, rellenada con ceros hasta una longitud total de 64 bytes.

El ipad (relleno interno) es simplemente la constante 36363636… repetida hasta una longitud de 64 bytes.

K' ⊕ ipad significa combinar la clave rellenada con ceros y el valor ipad mediante OR exclusivo (también conocido como XOR), una operación aritmética bit a bit muy apreciada por los aficionados a la informática.

K' ⊕ ipad) ‖ m significa añadir el mensaje (m) al valor obtenido anteriormente. Basta con agregar los bytes al final. (La longitud superará ahora los 64 bytes. No se preocupe por ello.)

H( (K' ⊕ ipad) ‖ m) significa aplicar su función hash (en este caso, SHA-256) a todo el valor entre paréntesis.

Cuando termine ese paso, deberá añadir el resultado a K' ⊕ opad, donde opad (relleno externo) es una constante formada por 5C5C5C5C… repetido hasta una longitud de 64 bytes. A continuación, deberá aplicar el hash al conjunto una vez más.

Por si se lo pregunta, los valores ipad y opad fueron elegidos (por los autores originales del algoritmo) de forma arbitraria, pero buscando maximizar la distancia de Hamming (o las diferencias bit a bit) entre la primera y la segunda mitad del hash. El hash se realiza por mitades, de forma anidada, para evitar diversas formas de suplantación.

Para facilitar la creación de valores HMAC, ID TECH ha publicado un formulario HTML en línea aquí, donde puede introducir los valores de KSN y BDK (clave raíz), derivar su clave MAC y utilizar HMAC para crear un hash MAC de 32 bytes (mediante SHA-256). Asegúrese de probar la opción «Generar HMAC (con salida detallada)» del menú desplegable situado en la parte superior del formulario. Obtendrá un práctico registro detallado de salida que explica, sin ambigüedades, el aspecto de cada pieza del rompecabezas HMAC.

Si utiliza nuestra herramienta en línea para generar una clave MAC con un KSN de 62 99 49 00 00 00 00 00 00 02 y una clave raíz (BDK) de 0123456789ABCDEFFEDCBA9876543210, que es la clave de prueba estándar ANSI, su clave MAC debería tener el valor 3E4A480ACE8B239B9539E6053EAB03D9. Si aplica el algoritmo HMAC con esa clave a una carga útil de 78 53 01 50 26 06 17 11 10 09 15 00 1E 10 00, debería obtener un hash HMAC de 32 bytes, cuyos primeros 16 bytes son 4EC7DFCF04D33CC6EC6F50920086A1DD. (ID TECH solo utiliza los primeros 16 bytes.) Esta es la “huella” mágica que se añadirá al comando Set Date and Time. El lector de tarjetas examinará los bytes de la carga útil en claro y utilizará su propio KSN y el código interno de derivación de claves para obtener el mismo valor HMAC que usted incluyó en el comando, verificando así que el comando proviene de una fuente que conoce la BDK secreta (0123456789ABCDEFFEDCBA9876543210); es decir, una fuente de confianza.

¿Tiene preguntas sobre DUKPT? ¿HMAC? ¿SRED? ¿P2PE? Póngase en contacto con nuestros expertos. Estamos aquí para ayudarle:

Número gratuito
1-800-984-1010