Soluzione sicura per la generazione di PIN univoci a client esterni

1

Sto valutando i requisiti per la consegna di un design di applicazione sicuro su un sistema di gestione PIN. Il contesto dietro la necessità è che i PIN vengono generati e spediti in modo sicuro ai client per scopi di autenticazione su un sistema di telefonia telefonica. Il sistema di telefonia quando viene presentato con l'identificazione dell'account e il PIN chiamerà il sistema di gestione PIN per l'autenticazione del client.

A tutti gli effetti ho stabilito che dovrebbero essere seguite le migliori pratiche su un servizio di autenticazione. I PIN devono essere protetti e confidenziali in base a come si potrebbero proteggere le password in un sistema. La mia domanda tuttavia ha a che fare con il modo migliore per gestire la generazione di un PIN.

I clienti non hanno la possibilità di decidere il proprio PIN. Il sistema deve generare un PIN per il cliente, quindi trasferirlo in modo sicuro a un dispositivo di sicurezza che lo stampa all'interno di una busta privata sigillata. Il PIN non scade ma può essere revocato da un amministratore. Il client può richiedere un nuovo PIN per qualsiasi motivo che invalidi il loro attuale PIN. Il PIN è di 8 caratteri alfanumerici.

Il requisito di cui non sono sicuro è che l'azienda insiste sul fatto che tutti i PIN dovrebbero essere unici. Nessuno dei due clienti dovrebbe mai per caso ricevere lo stesso PIN. A prima vista questo sembra un requisito relativamente benigno finché non comincio a considerare come il sistema potrebbe essere in grado di verificare l'unicità di un PIN su scala globale. Penso che se è preferibile inserire il PIN con dati specifici del record, quindi eseguire il hash del risultato, archiviamo un PIN univoco crittografico che non può essere annullato ed è resistente all'attacco di una tabella arcobaleno. Tuttavia, per tenere un registro di tutti i PIN univoci che sono già stati generati, avrei bisogno di mantenere un hash separato di questi in un'altra posizione, ma salato globalmente in modo tale da poter verificare se un PIN appena generato possibilità è stata già generata.

Penserei che solo mantenere un elenco di PIN con hash che sono stati generati storicamente rappresenta un enorme rischio per la sicurezza del sistema, probabilmente più rischioso della possibilità che a due client possa capitare di avere lo stesso PIN.

Ho difficoltà a capire non solo perché il business è irremovibile su questo, se è solo perché un sistema legacy simile opera in questo modo, o se ci sono alcune ragioni normative per cui deve essere così. Ho anche difficoltà a capire come posso implementare in modo sicuro tale soluzione senza creare una vulnerabilità. Qualche suggerimento su come o se questo può essere realizzato in modo sicuro?

UPDATE: informazioni aggiuntive, questa è una quantità relativamente piccola di client, forse meno di 20k. Se si dovesse determinare qual era il sale globale osservando il codice, una tabella arcobaleno potrebbe determinare un numero elevato di PIN attualmente in uso. Qualsiasi PIN conosciuto potrebbe avere una probabilità di 1 / 20k di essere corretto per un determinato cliente.

    
posta maple_shaft 07.06.2017 - 15:19
fonte

1 risposta

1

Tendo ad essere d'accordo con te sul fatto che il tuo team aziendale sta enfatizzando la necessità che i "PIN" siano unici tra i clienti, ma devi decidere se continuare a combattere o iniziare a lavorare per soddisfare i loro requisiti.

Vedo un paio di modi in cui puoi farlo. Il primo consiste nel creare un repository separato di PIN assegnati che è possibile consultare durante il nuovo processo di generazione del PIN. L'approccio più rapido sarebbe mantenere questi dati crittografati e decrittografarli solo per eseguire una ricerca o aggiungere una nuova voce. Ciò offre una certa protezione dei dati pur essendo molto efficiente.

Tuttavia, se un utente malintenzionato riesce a ottenere l'accesso alla chiave di decrittografia, può anche decrittografare questi dati, motivo per cui molte persone nel nostro settore disapprovano la crittografia degli autenticatori segreti piuttosto che eseguirne l'hashing. È possibile contrastare questo rischio utilizzando l'hardware per archiviare la chiave e gestire la crittografia, ma ciò aumenta la spesa per la soluzione.

In alternativa puoi semplicemente archiviare i PIN nel tuo database di autenticazione principale come faresti normalmente. Sarebbero (si spera) salati individualmente con sali unici e sottoposti a iterazioni di hashing appropriate (usando qualcosa come PBKDF2, bcrypt, argon2, ecc.). Quando viene generato un nuovo PIN, il sistema dovrebbe recuperare ciascun record con hash, estrarre il salt e utilizzarlo insieme al nuovo PIN per ripetere il normale processo di hashing. Quindi i risultati verrebbero confrontati e, se corrispondono, è necessario generare un nuovo PIN perché sai che c'è un conflitto.

Lo svantaggio di questo approccio è che il tempo e il costo di calcolo necessari per completare questo processo di confronto. Nella maggior parte dei casi, recupererai ogni record e ripeterai il processo di hashing più volte. A seconda della velocità del processo di hashing e del numero di record esistenti, potrebbero essere necessari da 5 a 20 secondi. Probabilmente non è un ritardo intollerabile in un processo che non affronta l'utente che si verifica solo occasionalmente, ma dovrai considerare il costo in base al tuo ambiente specifico. Questo è inefficiente ma preserva al meglio la sicurezza dei PIN.

    
risposta data 07.06.2017 - 19:33
fonte

Leggi altre domande sui tag