Post tecnico
Anatomia di un comando MAC
Molti clienti di ID TECH sono interessati alla crittografia punto a punto (P2PE)e, nel percorso verso la conformità alle rigorose normative P2PE di PCI, spesso prendono in considerazione dispositivi di pagamento SRED (Secure Reading and Exchange of Data). Tali dispositivi non si limitano a cifrare i dati al momento dell'acquisizione (funzionalità presente in tutti i dispositivi ID TECH), ma integrano anche rilevamento delle manomissioni, azzeramento automatico dei dati in caso di manomissione e altre funzionalità di sicurezza specializzate.
Tra le "altre funzionalità di sicurezza specializzate", la più importante è la cosiddetta autenticazione MAC dei comandi.
In crittografia, un codice di autenticazione del messaggio (MAC) è un breve codice che consente al destinatario di un messaggio di autenticarne la provenienza, ovvero di verificare che il messaggio provenga da un mittente attendibile. Il valore MAC garantisce sia l'integrità dei dati del messaggio sia la sua autenticità, combinando il messaggio con un segreto condiviso tra mittente e destinatario. Il messaggio viene trasmesso in chiaro, ma 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 qualcuno con 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 questo non sia accompagnato da un hash MAC verificabile tramite una chiave già memorizzata nel dispositivo. Il mittente del comando deve generare l'hash MAC utilizzando la stessa chiave che il dispositivo impiegherà per validarlo.
Un esempio può aiutare a chiarire il concetto.
Supponiamo di voler impostare la data e l'ora su un lettore di schede ID TECH Augusta S, che è un dispositivo SRED. Il comando "Imposta Data e Ora" è considerato sensibile, in quanto non dovrebbe essere consentito a soggetti non autorizzati di retrodatare (o altrimenti alterare) le transazioni. (Altri comandi "sensibili" includono, ad esempio, i comandi che aggiungono o rimuovono carte da una white list, o che modificano il Certificate Revocation List del dispositivo.)
In genere, la data e l'ora di un Augusta non SRED si impostano tramite il comando firmware 78 53 01 50, seguito dalla lunghezza del payload (0x08), poi dalla lunghezza data/ora (0x06), quindi 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 sopra descritta è identica, con la differenza che la lunghezza del payload è 0x26 e la "lunghezza MAC" è 0x1E, poiché vengono aggiunti 30 byte aggiuntivi di "payload MAC" alla fine.
Naturalmente, con Augusta, l'intero comando deve essere formattato secondo il protocollo NGA di ID TECH, il che consiste nell'anteporre STX (0x02) e due byte di lunghezza in little-endian all'inizio della struttura del comando, e nell'aggiungere LRC, checksum ed ETX (0x03) alla fine. La versione MAC finale dell'intero comando si presenta come segue (con i byte di comando 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
Analizziamolo sezione per sezione:
02 è STX.
2B 00 è la lunghezza (in 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 del 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 (end of transmission).
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 è necessario interrogare il dispositivo per ottenere 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. Ciò che potrebbe non essere immediatamente evidente è che, se un dispositivo contiene più chiavi DUKPT (ad esempio per Dati, MAC e PIN), ciascuna avrà 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 interrogarlo in qualsiasi momento tramite il comando (completo e formattato) 02090078463e040005010000000603.
Il KSN è fondamentale, in quanto partecipa al calcolo della chiave MAC, che è univoca per ogni utilizzo (e quindi non soggetta ad attacchi di tipo replay). Per ulteriori informazioni sui KSN e sulla derivazione delle chiavi DUKPT, si rimanda a il precedente articolo in due parti sull'argomento.
DERIVAZIONE HMAC
Ora si entra nel vivo della parte tecnica.
HMAC (si veda RFC 2104) è un metodo ampiamente accettato nel settore per la creazione di hash MAC mediante:
- — 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 DUKPT standard. Tali regole prevedono una specifica modalità di derivazione della 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 seguendo la ricetta dall'aspetto apparentemente intimidatorio riportata di seguito:
H( (K' ⊕ opad) ‖ H( (K' ⊕ ipad) ‖ m) )
Non lasciatevi scoraggiare. È in realtà abbastanza comprensibile. Il valore K è la chiave a 128 bit. K' (k-prime) indica la stessa chiave, con zero-padding fino a una lunghezza totale di 64 byte.
La piattaforma ipad (inner pad) è semplicemente la costante 36363636… ripetuta fino a una lunghezza di 64 byte.
K' ⊕ ipad indica la combinazione della chiave con zero-padding 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 alla fine. (La lunghezza sarà ora superiore a 64 byte. Non è un problema.)
H( (K' ⊕ ipad) ‖ m) indica l'applicazione della funzione hash (in questo caso SHA-256) all'intero valore racchiuso tra parentesi.
Una volta completato questo passaggio, il risultato verrà accodato a K' ⊕ opad, dove opad (outer pad) è una costante composta da 5C5C5C5C… ripetuta fino a una lunghezza di 64 byte. A quel punto si eseguirà nuovamente l'hashing dell'intero valore.
Nel caso ve lo stiate chiedendo, i valori ipad e opad sono stati scelti (dagli autori originali di questo algoritmo) in modo arbitrario, ma in maniera tale da massimizzare la distanza di Hamming (ovvero le differenze bit per bit) tra la prima e la seconda metà dell'hash. L'hash viene elaborato in due metà, in forma annidata, per prevenire varie forme di spoofing.
Per facilitare la generazione di valori HMAC, ID TECH ha pubblicato online un modulo HTML qui, nel quale è possibile inserire i valori KSN e BDK (chiave radice), derivare la propria chiave MAC e utilizzare HMAC per creare un hash MAC da 32 byte (tramite SHA-256). Si consiglia di provare l'opzione "Generate HMAC (with verbose output)" dal menu a discesa nella parte superiore del modulo. Si otterrà un'utilissima traccia di output dettagliata che illustra con chiarezza ogni componente 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, corrispondente alla chiave di test standard ANSI, il valore della chiave MAC risultante sarà 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, di cui i primi 16 byte sono 4EC7DFCF04D33CC6EC6F50920086A1DD. (ID TECH utilizza esclusivamente 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 ricavare lo stesso valore HMAC incluso nel comando, verificando così che il comando provenga necessariamente da una fonte a conoscenza della BDK segreta (0123456789ABCDEFFEDCBA9876543210); si tratta quindi di una fonte attendibile.
Hai domande su DUKPT? HMAC? SRED? P2PE? Contatta i nostri esperti. Siamo qui per aiutarti:
