ID TECH
Contatto
Tutti gli articoli tecnici

Post tecnico

Anatomia di un comando MAC

Molti clienti di ID TECH sono interessati alla cifratura punto a punto (P2PE)e, nell'ambito del loro percorso per raggiungere la conformità alle stringenti normative P2PE di PCI, spesso prendono in considerazione dispositivi di pagamento SRED (Secure Reading and Exchange of Data). Questi dispositivi non solo cifrano i dati nel momento in cui vengono acquisiti (funzionalità di cui sono dotati tutti i dispositivi ID TECH), ma integrano anche il rilevamento delle manomissioni, l'azzeramento automatico dei dati in caso di manomissione e altre funzionalità di sicurezza specializzate.

Tra le "altre funzionalità di sicurezza specializzate", la più importante è quella nota come autenticazione MAC dei comandi.

In crittografia, un codice di autenticazione del messaggio (MAC) è un breve codice che consente al destinatario di un messaggio di autenticarlo, ovvero di verificare che provenga da un mittente attendibile. Il valore MAC garantisce sia l'integrità dei dati del messaggio che la sua autenticità, combinando il messaggio con un segreto noto sia al mittente che al destinatario. Il messaggio viene trasmesso in chiaro, ma insieme ad esso viene inviato anche il messaggio corredato del MAC (che contiene il segreto in forma cifrata). Chiunque sia in possesso del segreto può verificare se il messaggio (e il relativo contenuto MAC) provenga da un altro soggetto che ha accesso allo stesso segreto.

Nei lettori di carte basati su SRED di ID TECH, alcuni comandi sensibili sono protetti da MAC: ciò significa che il dispositivo non eseguirà il comando a meno che non sia accompagnato da un hash MAC verificabile (tramite una chiave già memorizzata nel dispositivo). Il mittente del comando deve costruire l'hash MAC utilizzando la stessa chiave che il dispositivo impiegherà per validarlo.

Un esempio può rendere il concetto più chiaro.

Si supponga di voler impostare la data e l'ora su un lettore di carte ID TECH Augusta S, che è un dispositivo SRED. Il comando "Imposta data e ora" è considerato sensibile, poiché a soggetti non autorizzati non dovrebbe essere consentito retrodatare le transazioni (o alterarle in altro modo). Altri comandi "sensibili" includono, ad esempio, quelli che aggiungono o rimuovono carte da una lista bianca, oppure che modificano la Certificate Revocation List del dispositivo.

Normalmente, per impostare la data e l'ora di un Augusta non-SRED si utilizza il comando firmware 78 53 01 50, seguito dalla lunghezza del payload (0x08), dalla lunghezza della data/ora (0x06), dai sei byte di data e ora nel formato AA MM GG HH MM SS, e infine dalla "lunghezza MAC", che per un dispositivo non-SRED è zero. In Augusta S, la formula è la stessa, con la differenza che la lunghezza del payload è 0x26 e la "lunghezza MAC" è 0x1E, poiché 30 byte aggiuntivi di "payload MAC" vengono aggiunti in coda.

Naturalmente, con Augusta, l'intero comando deve essere formattato secondo il protocollo NGA di ID TECH: occorre anteporre STX (0x02) e due byte di lunghezza in formato little-endian alla struttura del comando, e aggiungere in coda LRC, checksum ed ETX (0x03). La versione finale del comando completo con MAC si presenta così (i byte del comando sono evidenziati in giallo):

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

Analizziamo la struttura sezione per sezione:

02 è STX.

2B 00 è la lunghezza (in formato little-endian) dell'intera struttura, escluso il trailer LRC/checksum/ETX.

78 53 01 50 è il comando firmware Set Date and Time.

26 (esadecimale) indica che seguono 38 byte di payload.

06 indica che la data/ora è composta da 6 byte, ovvero:

17 11 10 09 15 00 — 10 novembre 2017, ore 09:15:00.

1E indica che seguono 30 byte di payload MAC.

10 00 è un valore di lunghezza little-endian pari a 16 (poiché tutti gli hash MAC di ID TECH sono lunghi 16 byte).

4E C7 DF CF 04 D3 3C C6 EC 6F 50 92 00 86 A1 DD è l'hash MAC a 16 byte, ovvero l'"HMAC."

0A 00 è una lunghezza little-endian pari a 10, relativa al KSN che segue.

62 99 49 00 00 00 00 00 00 02 è il KSN MAC.

EB è il valore di Longitudinal Redundancy Check.

F9 è il checksum a 8 bit di tutto ciò che va da 78 all'ultimo byte del KSN (02).

03 è ETX (fine della trasmissione).

La costruzione di questo comando non presenta particolari difficoltà. Le parti che richiedono una spiegazione sono il KSN e l'HMAC (l'hash vero e proprio).

MAC KSN

Il MAC KSN (Key Serial Number) è un valore che deve essere interrogato direttamente sul dispositivo nel momento in cui se ne ha bisogno. Se si ha familiarità con ANSI X9.24-1 (lo standard Derived Unique Key Per Transaction), si sa che il KSN è un valore di 10 byte in cui i 21 bit meno significativi costituiscono un contatore che si incrementa ad ogni utilizzo. Quello che potrebbe non essere immediatamente evidente è che, se un dispositivo contiene più chiavi DUKPT (ad esempio per Data, MAC e PIN), ciascuna dispone di un proprio KSN dedicato che si incrementa in modo indipendente rispetto alle altre. Il KSN è tuttavia un valore pubblico e, in ID TECH Augusta, è possibile interrogare il MAC KSN in qualsiasi momento tramite il comando (completo e formattato) 02090078463e040005010000000603.

Il KSN è fondamentale perché fa parte del calcolo della chiave MAC, che è unica per ogni utilizzo (e quindi non soggetta ad attacchi di replay). Per ulteriori informazioni sui KSN e sulla derivazione delle chiavi DUKPT, consultare il mio precedente articolo in due parti sull'argomento.

DERIVAZIONE HMAC

Ora si entra nel vivo della parte tecnica.

HMAC (cfr. RFC 2104) è un metodo riconosciuto a livello industriale per la creazione di hash MAC che utilizza:

  • — una chiave monouso a 128 bit
  • — un payload di messaggio arbitrario
  • — hashing SHA-256

La chiave in questione viene derivata dinamicamente utilizzando il MAC KSN e l'IPEK del dispositivo (che a sua volta deriva da un BDK), secondo le regole standard DUKPT. Tali regole prevedono un metodo specifico per la derivazione di una chiave MAC (a differenza di una chiave dati o di una chiave PIN). Il tutto è descritto in il mio precedente post in due parti

Il temibile hash HMAC viene calcolato secondo la seguente formula dall'aspetto apparentemente intimidatorio:

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

Non lasciatevi scoraggiare. In realtà è abbastanza comprensibile. Il valore K è la chiave a 128 bit. K' (k-primo) indica la stessa chiave, con padding di zeri fino a una lunghezza totale di 64 byte.

Il ipad (inner pad) è semplicemente la costante 36363636… ripetuta per una lunghezza di 64 byte.

K' ⊕ ipad indica la combinazione della chiave con padding di zeri e il valore ipad tramite OR esclusivo (detto anche XOR), un'operazione aritmetica bit a bit molto apprezzata dagli appassionati di informatica.

K' ⊕ ipad) ‖ m indica che il messaggio (m) viene accodato al valore ottenuto in precedenza. È sufficiente aggiungere i byte in coda. (La lunghezza sarà ora superiore a 64 byte. Non è un problema.)

H( (K' ⊕ ipad) ‖ m) indica che la funzione hash (in questo caso SHA-256) viene applicata all'intero valore racchiuso tra parentesi.

Al termine di questo passaggio, il risultato viene accodato a K' ⊕ opad, dove opad (outer pad) è una costante composta da 5C5C5C5C… ripetuta per una lunghezza di 64 byte. L'intero valore viene quindi sottoposto nuovamente alla funzione hash.

Nel caso ve lo chiediate, i valori ipad e opad sono stati scelti arbitrariamente dagli autori originali di questo algoritmo, ma in modo da massimizzare la distanza di Hamming (ovvero le differenze a livello di bit) tra le metà anteriore e posteriore dell'hash. L'hashing viene eseguito in due metà in modalità annidata, per prevenire varie forme di spoofing.

Per semplificare la creazione dei valori HMAC, ID TECH ha pubblicato online un modulo HTML quinel quale è possibile inserire i valori KSN e BDK (chiave radice), derivare la propria chiave MAC e utilizzare HMAC per generare un hash MAC da 32 byte (tramite SHA-256). Assicuratevi di selezionare l'opzione "Generate HMAC (with verbose output)" dal menu a discesa nella parte superiore del modulo. Otterrete un output dettagliato estremamente utile che illustra, in modo inequivocabile, come si presenta ciascun elemento del processo HMAC.

Utilizzando il nostro strumento online per generare una chiave MAC con un KSN pari a 62 99 49 00 00 00 00 00 00 02 e una chiave radice (BDK) pari a 0123456789ABCDEFFEDCBA9876543210 — ovvero la chiave di test standard ANSI — la chiave MAC risultante dovrebbe avere il valore 3E4A480ACE8B239B9539E6053EAB03D9. Applicando l'algoritmo HMAC a un payload di 78 53 01 50 26 06 17 11 10 09 15 00 1E 10 00 con tale chiave, si otterrà un hash HMAC da 32 byte, i cui primi 16 byte sono 4EC7DFCF04D33CC6EC6F50920086A1DD. (ID TECH utilizza solo i primi 16 byte.) Questa è la "impronta digitale" che verrà aggiunta al comando Set Date and Time. Il lettore di carte analizzerà i byte del payload in chiaro e utilizzerà il proprio KSN e il codice interno di derivazione della chiave per ottenere lo stesso valore HMAC incluso nel comando, verificando così che il comando provenga necessariamente da una fonte a conoscenza della BDK (0123456789ABCDEFFEDCBA9876543210) e, di conseguenza, da una fonte attendibile.

Hai domande su DUKPT? HMAC? SRED? P2PE? Contatta i nostri esperti. Siamo qui per aiutarti:

Numero verde
1-800-984-1010