algorithm - vettori - simbolo diverso in flowgorithm




Come generare un codice/numero di verifica? (6)

  • Devo avere un numero ragionevole di combinazioni possibili (diciamo 1M)
  • Il codice deve essere il più breve possibile, per evitare errori da parte dell'utente

Bene, se vuoi che abbia almeno un milione di combinazioni, allora hai bisogno di almeno sei cifre. È abbastanza breve?

Sto lavorando a un'applicazione in cui gli utenti devono effettuare una chiamata e digitare un numero di verifica con la tastiera del proprio telefono.

Mi piacerebbe essere in grado di rilevare se il numero digitato è corretto o meno. Il sistema telefonico non ha accesso a un elenco di numeri validi, ma invece convaliderà il numero con un algoritmo (come un numero di carta di credito).

Ecco alcuni dei requisiti:

  • Deve essere difficile digitare un codice casuale valido
  • Deve essere difficile avere un codice valido se faccio un refuso (trasposizione di cifre, cifra sbagliata)
  • Devo avere un numero ragionevole di combinazioni possibili (diciamo 1M)
  • Il codice deve essere il più breve possibile, per evitare errori da parte dell'utente

Dati questi requisiti, come si genera un numero simile?

MODIFICARE :

@Haaked: il codice deve essere numerico, perché l'utente lo digita con il suo telefono.

@matt b: sul primo passaggio, il codice viene visualizzato su una pagina Web, il secondo passo è chiamare e digitare il codice. Non conosco il numero di telefono dell'utente.

Folowup: ho trovato diversi algoritmi per verificare la validità dei numeri (vedi questo interessante progetto Google Code: checkDigits ).


Devono essere solo numeri? Potresti creare un numero casuale compreso tra 1 e 1M (ti suggerirei anche più in alto) e poi Base32 lo codificherà . La prossima cosa che devi fare è Hash quel valore (usando un valore salt segreto) e base32 codificare l'hash. Quindi aggiungi le due stringhe insieme, magari separate dal trattino.

In questo modo, puoi verificare il codice in arrivo in modo algoritmico. Basta prendere il lato sinistro del codice, cancellarlo usando il tuo segreto e confrontare quel valore sul lato destro del codice.


Quando crei il codice di verifica, hai accesso al numero di telefono del chiamante?

In tal caso, vorrei utilizzare il numero di telefono del chiamante e eseguirlo attraverso una sorta di funzione di hashing in modo da poter garantire che il codice di verifica che hai fornito al chiamante nel passaggio 1 sia lo stesso che stanno inserendo nel passaggio 2 (per assicurarti non stanno usando il codice di convalida di un amico o hanno semplicemente fatto un'ipotesi molto fortunata).

Per quanto riguarda l'hashing, non sono sicuro che sia possibile prendere un numero di 10 cifre e uscire con un risultato di hash che sarebbe <10 cifre (credo che dovresti vivere con una certa quantità di collisione) ma penso questo aiuterebbe a garantire che l'utente sia chi dice di essere.

Ovviamente questo non funziona se il numero di telefono utilizzato nel passaggio 1 è diverso da quello da cui chiama nel passaggio 2.


Sei collegato al progetto di controllo cifre e l'uso della funzione "codifica" sembra una buona soluzione. Dice:

la codifica può generare un'eccezione se i dati "cattivi" (ad esempio non numerici) vengono passati ad essa, mentre la verifica restituisce solo true o false. L'idea è che normalmente la codifica ottiene i dati da fonti interne "attendibili" (una chiave di database, ad esempio), quindi dovrebbe essere piuttosto normale, in effetti, eccezionale che vengano trasmessi dati non validi.

Sembra quindi che potresti passare la funzione di codifica a una chiave di database (5 cifre, ad esempio) e potresti ottenere un numero che soddisfi i tuoi requisiti.


Supponendo che tu sappia già come individuare la chiave che l'utente ha colpito, questo dovrebbe essere fattibile abbastanza facilmente. Nel mondo della sicurezza, esiste la nozione di una password "una tantum". Questa viene a volte definita "password usa e getta". Normalmente questi sono limitati ai valori ASCII (facilmente tipizzabili). Quindi, [a-zA-z0-9] e un gruppo di simboli facilmente tipizzabili. come virgola, punto, punto e virgola e parentesi. Nel tuo caso, tuttavia, probabilmente vorrai limitare l'intervallo a [0-9] e includere eventualmente * e #.

Non sono in grado di spiegare tutti i dettagli tecnici di come questi codici monouso siano generati (o funzionino) in modo adeguato. Dietro c'è una certa matematica intermedia, che macellerei senza prima esaminarlo da solo. Basti dire che usi un algoritmo per generare un flusso di password monouso. Non importa quanti codici precedenti sai, il successivo dovrebbe essere impossibile da indovinare! Nel tuo caso, dovrai semplicemente utilizzare ciascuna password nell'elenco come codice casuale dell'utente.

Piuttosto che fallire nello spiegare da solo i dettagli dell'implementazione, ti indicherò un articolo di 9 pagine in cui puoi leggerlo da solo: https://www.grc.com/ppp.htm


Vuoi segmentare il tuo codice. Parte di esso dovrebbe essere un CRC a 16 bit del resto del codice.

Se tutto ciò che si desidera è un numero di verifica, basta usare un numero di sequenza (supponendo che si abbia un singolo punto di generazione). In questo modo sai che non stai ottenendo duplicati.

Quindi si prefissa la sequenza con un CRC-16 di quel numero di sequenza E qualche chiave privata. Puoi usare qualsiasi cosa per la chiave privata, purché la tenga privata. Rendilo qualcosa di grande, almeno un GUID , ma potrebbe essere il testo di War and Peace del progetto Gutenberg . Deve solo essere segreto e costante. Avere una chiave privata impedisce alle persone di essere in grado di falsificare una chiave, ma l'utilizzo di un CR a 16 bit rende più facile la rottura.

Per convalidare, basta dividere il numero nelle sue due parti e quindi prendere un CRC-16 del numero di sequenza e della chiave privata.

Se si desidera oscurare maggiormente la parte sequenziale, dividere il CRC in due parti. Inserisci 3 cifre nella parte anteriore e 2 nella parte posteriore della sequenza (zero pad in modo che la lunghezza del CRC sia coerente).

Questo metodo ti consente di iniziare anche con chiavi più piccole. I primi 10 tasti saranno 6 cifre.





data-consistency