Dovresti usare le smart card. Possono gestire crypto e divulgare i loro contenuti solo sulla presentazione di una chiave, oltre a crittografare la comunicazione lettore / scheda in modo che il sniffing non funzioni.
Per le carte contattate suppongo che una scheda PKI funzionerebbe, dove la carta dimostra che ha la chiave privata per un particolare certificato, e la usi per estrarre il record dell'utente da un database. Il problema è che non è possibile memorizzare dati significativi su di esso (oltre a una chiave privata), che richiede l'utilizzo di un database e quindi impedisce l'utilizzo offline della scheda. Non so se ci siano carte contattate che archiviano semplicemente dati arbitrari e li restituiscano alla presentazione di una chiave.
Per le carte contactless (NFC) ci sono le carte Mifare che possono memorizzare i dati e solo rivelarli sulla presentazione di una chiave. Non fanno crypto (non esiste un concetto di crittografia asimmetrica, sono solo cose semplici come "dammi la chiave per il blocco dati XX, se la chiave è OK ti restituisco il contenuto del blocco") ma d'altra parte puoi archiviare arbitrariamente dati e quindi consentire ai dispositivi offline di interagire ancora con la scheda con il sistema rimanente sicuro (se implementato correttamente).
Le chiavi stesse non sono bruteforceable (troppe possibilità) ma alcune carte avevano difetti (Mifare classico per esempio) che permettevano di ottenere la chiave di un settore e quindi usare un altro difetto per recuperare tutte le chiavi di altri settori dalla conoscenza di un singolo uno. Tuttavia questi difetti sono stati corretti nelle ultime revisioni delle carte.
Per la tua applicazione, le seguenti schede potrebbero essere adatte:
- Mifare Ultralight EV1 - utilizza una chiave a 32 bit per proteggere i dati memorizzati su di esso, anche se la comunicazione con il lettore non è crittografata ed è quindi vulnerabile allo sniffing.
- Mifare Ultralight C - utilizza la crittografia 3DES tra il lettore e la scheda, una sicurezza migliore di quella precedente.
- Mifare Plus - versione aggiornata di Mifare Classic che mitiga le sue vulnerabilità, utilizza chiavi e crittografia proprietaria roll-your-own, non sicuro se sono stati scoperti difetti in questa nuova revisione poiché le vulnerabilità Classic sono state risolte.
- Mifare DESFire EV2 - ultima revisione della serie DESFire, supporta la crittografia AES.
Indipendentemente dalla carta scelta da questo elenco, ti suggerisco di implementarla in questo modo:
-
un blocco di dati con qualche ID utente o riferimento al record dell'utente nel database, impostato su accesso pubblico, quindi non è necessaria alcuna chiave (o una chiave predefinita, a bassa sicurezza). Puoi anche utilizzare l'UID della scheda ma attenzione, potrebbero non essere univoci.
-
una volta letto quel blocco (o UID) viene letto il computer collegato al lettore cerca l'utente nel database e ottiene la sua chiave univoca per scheda per autenticare e recuperare altri blocchi di dati riservati per dimostrare effettivamente all'utente è chi sta fingendo di essere (tramite un nonce o un valore segreto memorizzato lì) e qualcuno non ha semplicemente clonato l'ID utente disponibile pubblicamente dal primo settore.
-
puoi crittografare i dati della carta ancora una volta (puoi utilizzare l'UID della carta come IV) con una chiave che solo la tua infrastruttura conosce (preferibilmente un singolo per utente), in questo modo se qualcuno riesce ancora a entrare dei dati riservati memorizzati sulla carta, non avranno molto senso.
-
non utilizzare UID per qualcosa di sensibile, si dovrebbe presumere che non siano univoci, possano essere facilmente letti e duplicati (nonostante ciò che NXP dice sull'unicità dell'UID, ci sono "magiche" contraffazioni Mifare disponibili che permette di cambiare l'UID usando un comando personalizzato).