Ho bisogno del tuo consiglio sulla sicurezza di questo design.
Ho uno scenario in cui un'applicazione server e un'applicazione smart card devono condividere un valore, ad es. 52, che è stato codificato in un token decimale lungo ma non esiste una connessione di rete diretta tra le due applicazioni.
Il token ha una lunghezza di 20 cifre e viene trasmesso via SMS a un destinatario che lo inserisce in un terminale, che lo inoltra alla smart card.
La domanda è qual è il modo migliore per autenticare il token.
Ecco cosa mi è venuto in mente:
- Creiamo una chiave simmetrica univoca (K) e la memorizziamo in modo sicuro nel server e l'elemento sicuro della smart card.
- Generiamo 10000 numeri casuali a 32 cifre e li memorizziamo in modo sicuro nel server e nell'elemento sicuro della smart card.
- Per generare un token, il server seleziona un indice (n) tra i 10000 numeri casuali, ad esempio 4821
- Associa il suo valore (v) a 7 indici separati (x0, x1 ... x6) nel formato base64 della chiave simmetrica (K).
- Infine, crea il token aggiungendo
- le forme base 10 dei 7 caratteri (K [x0], K [x1] ... K [x6]),
- l'indice (n) e
- il valore originale a due cifre, ovvero 52
Ad esempio, se i 7 caratteri nel passaggio 5 sono rappresentati da "19-24-45-22-34-99-45", il token finale sarà "19-24-45-22-34-99- 45-48-21-52"
La smart card autentica il token eseguendo i passaggi 3-5 usando 4821 come valore per n, quindi confrontando il suo token con il token in entrata.
Nota: per evitare replay, sia il server che la smart card indicheranno null 4821 in modo che il set di caratteri mappati ad esso non possa essere selezionato o utilizzato di nuovo.
Essenzialmente ciò che ritengo di aver raggiunto è la possibilità di trasferire un token monouso autenticato di 20 cifre.
Supponendo che i dati memorizzati sul server e nell'elemento sicuro della smart card siano entrambi sicuri, ci sono dei nodi nell'armatura di cui devo essere a conoscenza?
Qualche consiglio sarà benvenuto.
Grazie
- - - EDIT (24-Apr-2013 14:45 GMT) - - -
Dev'essere stato un lungo giorno e una notte tarda e dopo aver letto tutte le grandi risposte (cioè i controlli di sanità mentale) di seguito, mi sembra di essere tornato in me e di aver gettato via l'idea criptata, pensata male e fatta in casa. :)
Come sfondo, questa soluzione è pensata per essere utilizzata in aree rurali con copertura di rete GPRS o 3G minima o nulla, e praticamente tutti hanno telefoni cellulari economici che supportano solo GSM e SMS (al contrario degli smartphone) ). Inoltre, le reti sono molto inaffidabili.
Ad ogni modo, ecco quello che ho ora:
Impostazioni
- Genera una chiave simmetrica condivisa univoca (K)
- Genera un file TAN (numero di autenticazione della transazione) (S)
- Copia K e S nel database del server e l'elemento sicuro della smart card
transazione
Se un server deve inviare un importo (v) a una smart card,
- Carica il file S e seleziona un nonce (n), cioè
n = S[0]
- Invalida il nonce eliminandolo dal file S (previene attacchi di replay)
- Crea un messaggio concatenando l'importo e il nonce, ad esempio
m = v || n
- Crea un testo cifrato (e1) cioè
e1 = H(K,m)
dove H="HMAC-SHA-1" o "CBC-MAC-Y" i.e ISO / IEC 9791-1 Algoritmo 3 - Converte il testo cifrato in base 10 e lo invia (via SMS) al cellulare dell'utente
- Detrae l'importo dal saldo lato server dell'utente
Quando l'utente "riceve il codice tramite SMS, digita la quantità (v) e il codice nel terminale che la trasmette all'app della smart card, che a sua volta esegue quanto segue:
- Carica il file S e seleziona un nonce (n), cioè
n = S[i]
, dove i = 0 - Crea un messaggio concatenando l'importo e il nonce, ad esempio
m = v || n
- Crea un testo cifrato (e2) cioè
e2 = H(K,m)
dove H="HMAC-SHA-1" o "CBC-MAC-Y" i.e ISO / IEC 9791-1 Algoritmo 3 - Se
e1 != e2
, ripete i passaggi (1) - (3) mentre incrementa (i) fino a 20 volte (per consentire la deriva). Se una corrispondenza non esiste, genera un messaggio di errore ed esce - Se
e1 == e2
, accetta il valore come credito sul saldo lato client dell'utente - Infine, invalida tutti i nonces provati nel passaggio (1) eliminandoli dal file S
File TAN
Un file TAN è un elenco di 1000 nonce casuali ognuno dei quali è un numero di autenticazione di transazione esadecimale di 8 caratteri (TAN). Verrà utilizzato per determinare il valore nonce che verrà aggiunto a un messaggio per garantirne l'univocità e quindi impedire attacchi di riproduzione.