Domanda

Sto cercando di sviluppare un sistema in cui devo assegnare ad ogni utente un codice pin unico per la sicurezza.L'utente dovrà solo inserire il codice pin come mezzo di identificazione di se stesso.Quindi io non voglio che l'utente sia in grado di indovinare di un altro utente pincode.Supponendo che il max utenti dovrò è 100000, per quanto tempo questo pin code?

ad es.1234 4532 3423

Devo generare il codice, tramite una sorta di algoritmo?O dovrei generare in modo casuale è?

Fondamentalmente io non voglio che la gente a essere in grado di indovinare gli altri popoli codice pin e si dovrebbe ottenere un numero sufficiente di utenti.

Dispiace se la mia domanda suona un po ' di confusione, ma sarebbe lieto di chiarire eventuali dubbi.

vi ringrazio molto.

AGGIORNAMENTO

Dopo aver letto tutti i post qui sotto, vorrei aggiungere qualche dettaglio in più.

  1. Quello che sto cercando di realizzare è qualcosa di molto simile a un gratta e vinci.
  2. Un utente viene consegnata una scheda, che dovrà zero per trovare il codice pin.
  3. Ora, con questo codice pin, l'utente deve essere in grado di accedere al mio sistema.

Non è possibile aggiungere extra di sicurezza (ad es.nome utente e password), come poi sarà scoraggiare l'utente di utilizzare i gratta e vinci.Voglio rendere difficile quanto più possibile indovinare il codice pin, entro i limiti.

grazie a tutti per il vostro incredibile risponde di nuovo.

È stato utile?

Soluzione

Se assumiamo un massimo di 100.000 utenti, possono avere PIN univoci con 0-99.999 ovvero. 5 cifre.

Tuttavia, ciò renderebbe più facile indovinare i PIN con il numero massimo di utenti. Se è possibile limitare il numero di tentativi sul PIN, è possibile disporre di un PIN più breve. per esempio. massimo 10 tentativi falliti per IP al giorno.

Dipende anche dal valore di ciò che stai proteggendo e da quanto catastrofico sarebbe se la strana persona uscisse.

Sceglierei 9 cifre se si desidera mantenerlo breve o 12 cifre se si desidera un po 'più di sicurezza dall'ipotesi automatizzata.

Per generare i PIN, prenderei una alta risoluzione del tempo insieme ad alcune salt e forse un numero pseudo-casuale, genera un hash e usa le prime 9 o 12 cifre. Assicurati che ci sia un ritardo ragionevole e casuale tra le nuove generazioni di PIN, quindi non generarle in un ciclo e, se possibile, renderle avviate dall'utente.

ad es. Sinistra (Sha1 (DateTime + Salt + PseudoRandom), 9)

Altri suggerimenti

4 cifre casuali dovrebbero essere sufficienti se lo aggiungi a un ID utente noto univoco (potrebbe essere ancora un numero) [come raccomandato da Starblue]

Anche il generatore di numeri pseudo casuali dovrebbe andare bene. Puoi archiviarli nel DB utilizzando la crittografia reversibile (AES) o l'hash unidirezionale

La preoccupazione principale che hai è quante volte una persona può inserire in modo errato il pin prima di essere bloccato. Dovrebbe essere basso, diciamo intorno a tre ... Ciò impedirà alle persone di indovinare il numero di altre persone.

Non più di 6 cifre e le persone le dimenticheranno, o peggio, le scriveranno su un post-it sul loro monitor.

Supponendo che un account si blocchi con 3 tentativi errati, quindi avere un pin a 4 cifre più un componente ID utente UserId (999999) + Pin (1234) ti dà una possibilità di 3/10000 di qualcuno che indovina. È accettabile? In caso contrario, fai la lunghezza del perno 5 e ottieni 3/100000

Mi permetto di suggerire un approccio alternativo?Guarda Carta Perfetta Password, e il derivati è richiesto .

Si potrebbe usare questo "così come sono" per generare un tempo di Perni, o semplicemente per generare un unico PIN per utente.

Tenete a mente, anche, che il duplicato Pin non sono di per sé un problema:qualsiasi attacco quindi semplicemente provare più user-id.

(Percorrenza di avviso:Io sono sicuramente un esperto di sicurezza.)


Ecco una seconda risposta:dalla ri-lettura, presumo che tu non vuoi una user-id in quanto tale, sei solo la validazione di un set di emessi gratta e vinci.Ho anche presumere che non si desidera utilizzare alfabetico Pin.

È necessario scegliere un PIN di lunghezza tale che la probabilità di indovinare un codice PIN valido a meno di 1/(Il numero di tentativi è possibile proteggere contro).Così, per esempio, se si dispone di 1 milione di valido Pin, e si desidera proteggere contro 10000 ipotesi, avrete bisogno di una di 10 cifre del PIN.

Se si utilizza John Graham-Cumming s versione della Carta Perfetta Password di sistema, è possibile:

  1. Configurare questo per (diciamo) 10 cifre decimali pin
  2. Scegliere un segreto IV/frase-chiave
  3. Generare (per dire) il primo milione di password/Pin)

Ho il sospetto che questo è una procedura generica che potrebbe, per esempio, essere utilizzato per generare 25 alfanumerici id del prodotto, troppo.

Mi dispiace per farlo da approssimazione successiva;Spero che arriva un po ' più vicino a quello che stai cercando.

Un sacco di grandi risposte finora: semplice, efficace ed elegante!

Immagino che l'applicazione sia un po 'simile alla lotteria, in quanto ogni utente riceve un gratta e vinci e lo usa per chiedere alla tua applicazione se " ha già vinto! " Quindi, da quel punto di vista, vengono in mente alcune nuove questioni:

Composizione in guerra o equivalente in Internet: un utente canaglia può colpire ripetutamente la tua app, ad esempio indovinando ogni numero di 10 cifre in successione? Se questa è una possibilità, considera di limitare il numero di tentativi da una determinata posizione. Un modo efficace potrebbe essere semplicemente quello di rifiutare di rispondere più di, per esempio, un tentativo ogni 5 secondi dallo stesso indirizzo IP. Ciò rende gli attacchi guidati dalla macchina inefficienti ed evita il problema di blocco .

Problema di blocco : se blocchi un account in modo permanente dopo un numero qualsiasi di tentativi falliti, sei soggetto a attacchi denial of service . L'attaccante sopra potrebbe effettivamente bloccare ogni utente a meno che non riattivi gli account dopo un certo periodo di tempo. Ma questo è un problema solo se i tuoi PIN consistono in un'ovvia concatenazione di ID utente + chiave, perché un utente malintenzionato può provare ogni chiave per un determinato ID utente. Questa tecnica riduce anche drasticamente lo spazio delle chiavi perché solo alcune delle cifre del PIN sono veramente casuali. D'altra parte, se il PIN è semplicemente una sequenza di cifre casuali, il blocco deve essere applicato solo all'indirizzo IP di origine. (Se un tentativo fallisce, nessun account valido è interessato, quindi cosa vorresti & Quot; lock & Quot ;?)

Archiviazione dei dati : se stai davvero costruendo una sorta di sistema simile a una lotteria devi solo memorizzare i PIN vincenti ! Quando un utente inserisce un PIN, puoi cercare un elenco relativamente piccolo di PIN / premi (o il tuo equivalente). Puoi trattare & Quot; perdere & Quot; e PIN non validi identici con un " Siamo spiacenti, migliore fortuna la prossima volta " messaggio o " default " premio se l'economia ha ragione.

Buona fortuna!

La domanda dovrebbe essere, " quante ipotesi sono necessarie in media per trovare un codice PIN valido, rispetto a quante ipotesi stanno facendo gli attaccanti? "

Se generi 100000 codici a 5 cifre, ovviamente ci vuole 1 ipotesi. È improbabile che ciò sia abbastanza buono.

Se generi 100000 codici a N cifre, occorrono (n-5) ^ 10 ipotesi. Per capire se questo è abbastanza buono, devi considerare come il tuo sistema risponde a un'ipotesi sbagliata.

Se un attaccante (o, tutti gli attaccanti combinati) può fare 1000 supposizioni al secondo, allora chiaramente n deve essere abbastanza grande per fermare un determinato attaccante. Se blocchi definitivamente il loro indirizzo IP dopo 3 ipotesi errate, poiché è improbabile che un determinato aggressore abbia accesso a più, per esempio, 1000 indirizzi IP, n = 9 sarebbe sufficiente per contrastare quasi tutti gli aggressori. Ovviamente se dovrete affrontare attacchi distribuiti o attacchi da una botnet, allora 1000 indirizzi IP per attaccante non sono più un presupposto sicuro.

Se in futuro è necessario emettere ulteriori codici (oltre 100.000), ovviamente è più facile indovinare un codice valido. Quindi probabilmente vale la pena dedicare un po 'di tempo ora ad assicurarsi delle future esigenze di ridimensionamento prima di fissare una dimensione.

Dato il tuo caso d'uso del gratta e vinci, se gli utenti utilizzeranno il sistema per un lungo periodo, consiglierei di consentire loro (o forzarli) di " upgrade " il loro codice PIN a un nome utente e una password di loro scelta dopo il primo utilizzo del sistema. Quindi ottieni i soliti vantaggi di nome utente / password, senza scartare la facilità di primo utilizzo semplicemente digitando il numero sulla carta.

Per quanto riguarda come generare il numero, presumibilmente ognuno di quelli che genererai li memorizzerai, nel qual caso direi di generarli casualmente e scartare i duplicati. Se li generi usando qualsiasi tipo di algoritmo e qualcuno riesce a capire l'algoritmo, allora possono capire codici PIN validi. Se selezioni un algoritmo in modo tale che qualcuno non riesca a capire l'algoritmo, allora quasi è un generatore di numeri pseudo-casuale (l'altra proprietà dei PRNG è che sono distribuiti uniformemente, il che aiuta anche qui perché rende più difficile indovinare i codici), nel qual caso potresti anche generarli casualmente.

Se usi algoritmi di generazione di numeri casuali, quindi non hai mai PIN come " 00038384882 " , inizia con 0 (zeri), poiché i numeri interi non iniziano mai con " 0 " ;. il PIN deve essere avviato con 1-9 numeri tranne 0.

Ho visto molti numeri PIN includere e inizia molti zeri, quindi elimini il primo milione di numeri. Necessità di permutazione per i calcoli per quanti numeri eliminati.

Penso che sia necessario inserire 0-9 numeri in un hash, cavarsela a caso dall'hash e creare il numero PIN della stringa.

Se si desidera generare scratch-card di tipo i codici pin, quindi è necessario utilizzare grandi numeri, circa 13 cifre;e, inoltre, devono essere simili ai numeri di carta di credito, avere una somma di controllo o di verifica di cifre incorporato nel numero stesso.È necessario disporre di un algoritmo per generare un pin basata su alcuni dati iniziali, che può essere una sequenza di numeri.La risultante pin deve essere univoco per ogni numero della sequenza, in modo che se si genera a 100.000 codici pin devono essere tutti diversi.In questo modo si sarà in grado di convalidare, non solo un numero da verifica contro un database, ma è possibile verificare prima.

Una volta ho scritto una cosa per quello scopo, non posso darti il codice, ma l'idea generale è questa:

  • Preparare uno spazio di 12 cifre
  • Formato il numero di cinque cifre (da 00000 a 99999) e la diffusione lungo lo spazio in un certo modo.Per esempio, il numero 12345 può essere diffusa come __3_5_2_4__1.È possibile variare il modo in cui si sviluppa il numero a seconda se è un numero pari o dispari, o un multiplo di 3, etc.
  • In base al valore di certe cifre, di generare più cifre (per esempio, se la terza cifra è anche, quindi creare un numero dispari e metterlo nel primo spazio aperto, altrimenti creare un numero pari e mettere in secondo spazio aperto, ad es._83_5_2_4__1
  • Una volta che avete generato un numero a 6 cifre, si avrà solo uno spazio aperto.Si dovrebbe sempre lasciare lo stesso spazio aperto (per esempio l'ultimo spazio).Posizionare la verifica cifre che in quel luogo.
  • Per generare la verifica cifra è necessario eseguire alcune operazioni aritmetiche al numero che avete generato, per esempio con l'aggiunta di tutte le cifre in posizione dispari e moltiplicandoli per qualche altro numero, quindi sottraendo tutte le cifre, anche le posizioni, e infine l'aggiunta di tutte le cifre insieme (è necessario variare l'algoritmo un po ' in base al valore di certe cifre).Alla fine hai una verifica cifre che si includono nel generato un codice pin.

Così ora si può convalidare il generati i codici pin.Per un dato codice pin, è possibile generare la verifica della cifra di controllo contro quella inclusa nel perno.Se è OK allora è possibile estrarre il numero originale eseguendo le operazioni in senso inverso.

Non sembra così buona, perché sembra che la sicurezza attraverso l'oscurità, ma è l'unico modo che è possibile utilizzare questo.Non è impossibile per qualcuno di indovinare un codice pin, ma a 12 cifre con una verifica in cifre, sarà molto difficile, dal momento che si deve provare 1.000.000.000.000 di combinazioni e di 100.000 valido codici pin, in modo che per ogni codice pin ci sono 10.000.000 di quelli non validi.

Vorrei ricordare che questo è utile per monouso codici pin;una persona che utilizza uno di questi codici solo una volta, per esempio per ricaricare una prepagata telefono cellulare.Non è una buona idea di utilizzare questi pin come token di autenticazione, soprattutto se è l'unico modo per autenticare qualcuno (non si dovrebbe mai MAI autenticare qualcuno solo attraverso un singolo pezzo di dati;il minimo è username+password)

Sembra che tu voglia usare il codice pin come unico mezzo di identificazione per gli utenti. Una soluzione praticabile sarebbe quella di utilizzare le prime cinque cifre per identificare l'utente, e aggiungi quattro cifre come codice PIN.

Se non si desidera archiviare i PIN, questi possono essere calcolati applicando un hash crittograficamente sicuro (SHA1 o superiore) al numero utente più un codice segreto a livello di sistema.

  

Devo generare questo codice tramite alcuni   una specie di algoritmo?

No. Sarà prevedibile.

  

O dovrei generarlo casualmente?

Sì. Usa un generatore casuale crittografico o lascia che l'utente scelga il proprio PIN.

In teoria, 4 cifre saranno molte poiché gli emittenti di carte ATM riescono a supportare una comunità molto ampia con questo (e ovviamente non possono essere e non devono essere unici). Tuttavia, in quel caso dovresti limitare il numero di tentativi di inserimento del PIN e bloccarli dopo tanti tentativi, come fanno le banche. E dovresti anche convincere l'utente a fornire un ID utente (nel caso ATM, che è effettivamente sulla carta).

Se non vuoi limitarli in quel modo, potrebbe essere meglio abbandonare l'idea del PIN e usare una password standard (che è essenzialmente quello che è il tuo PIN, solo con una lunghezza molto breve e un set di caratteri limitato) . Se devi assolutamente limitarlo ai valori numerici (perché hai un PIN pad o qualcosa del genere), considera di fare una lunghezza minima (configurabile) di 4 a piuttosto che la lunghezza fissa.

Non dovresti archiviare il PIN in modo chiaro ovunque (ad es. salt e hash come una password), tuttavia, data la breve lunghezza e il set di caratteri limitato, sarà sempre vulnerabile a una ricerca di forza bruta, dato un modo semplice per verificarlo.

Esistono anche altri schemi che possono essere utilizzati, se puoi dirci di più sui tuoi requisiti (è un'app Web? un sistema incorporato? ecc.)

C'è una differenza tra indovinare il PIN di un utente target e quello di qualsiasi utente valido. Dal tuo caso d'uso, sembra che il PIN sia utilizzato per ottenere l'accesso a determinate risorse, ed è quella risorsa che possono essere gli attaccanti, non le identità particolari degli utenti. In tal caso, sarà necessario rendere sufficientemente validi i numeri PIN sparsi tra tutti i possibili numeri della stessa cifra.

Come indicato in alcune risposte, è necessario rendere il PIN sufficientemente casuale, indipendentemente dal fatto che si desideri generarlo da un algoritmo. La casualità è di solito misurata dalla entropia del PIN.

Ora, supponiamo che il tuo PIN sia di entropia N , e ci sono 2 ^ M utenti nel tuo sistema ( M < N ), la probabilità che un'ipotesi casuale produca un PIN valido è 2 ^ {MN} . (Scusate le notazioni in lattice, spero sia abbastanza intuitivo). Quindi da lì puoi determinare se quella probabilità è abbastanza bassa dato N e M , o calcolare la N richiesta dalla probabilità desiderata e M .

Esistono vari modi per generare i PIN in modo da non dover ricordare tutti i PIN generati. Ma avrai bisogno di un PIN molto lungo per renderlo sicuro. Questo probabilmente non è quello che vuoi.

L'ho già fatto prima con PHP e un database MySQL. Avevo una funzione di permutazioni che avrebbe prima assicurato che il numero di codici richiesti - $ n, alla fine $ l, con il numero di caratteri, $ c - fosse in grado di essere creato prima di iniziare il processo di generazione.

Quindi, memorizzerei ogni nuovo codice nel database e lo farei sapere tramite errori UNIQUE KEY che si è verificata una collisione (duplicata). Quindi continua fino a quando non ho realizzato $ n numero di codici creati con successo. Ovviamente potresti farlo in memoria, ma volevo mantenere i codici da utilizzare in una stampa unione di MS Word. Quindi ... poi li ho esportati come file CSV.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top