2009-04-03 22 views
40

Mi chiedo come funzionano i generatori di numeri di serie e il validatore. Il mio obiettivo sarebbe quello di generare un numero di serie con cinque parti composto solo da numeri e lettere.Per curiosità: come vengono generati i numeri seriali? Suggerimenti, algoritmi?

Mi piace programmare come un hobby e non mi definisco un programmatore professionista. Tuttavia, sono molto interessato a come quelle funzioni interessanti funzionano tecnicamente per allargare la mia mente.

Sono graditi suggerimenti, esperienze o algoritmi scritti.

+0

in quale contesto verrà utilizzato il numero di serie? È solo un identificatore o è pensato per essere un tipo di tipo sicuro (come la chiave di registrazione di Windows)? – TofuBeer

+2

Qualunque cosa tu faccia, prova a fare la cifra più a sinistra non zero in modo che i "codici" non siano interpretati come numeri e possano scomparire quando vengono importati in Excel e in altri formati. Ho scoperto che è uno dei maggiori problemi nel mio settore in cui li usiamo molto. Abbiamo imparato ad avviare tutti i numeri di serie con un 1. Penso che di recente ci sia stato un videogioco che ha rilasciato numeri seriali errati e che potrebbero essersi imbattuti in un problema come questo. –

risposta

16

Beh, i numeri tradizionalmente di serie sono numeri seriali ... Quindi il primo esempio fuori dalla linea di produzione ha sn 0001, quindi il prossimo è 0002 e il prossimo è 0003. Penso che molte persone possano elaborare quell'algoritmo.

Penso che si stia effettivamente chiedendo informazioni sui codici prodotto, che utilizzano un meccanismo simile alla firma dei messaggi con chiave pubblica: il codice prodotto è il valore crittografato, il programma ha una chiave pubblica che consente di verificare che la chiave sia valida , ma solo il fornitore del software ha la chiave segreta per "firmare" il codice "Product Key". L'articolo di Wikipedia su digital signatures ha il meccanismo generale; l'unica condizione è che per una chiave che deve essere inserita dall'utente deve essere un po 'più breve di una PGP.

Se si dispone di un numero seriale molto breve, è improbabile che sia abbastanza grande da memorizzare il risultato di un tipico meccanismo di firma, nel qual caso è abbastanza comune utilizzare solo una variante del checksum su di esso. Questo ha lo svantaggio di essere facile da decodificare - la sicurezza è perché l'algoritmo è "segreto" piuttosto che a causa di eventuali proprietà crittografiche. Ogni prodotto ha il proprio algoritmo e di solito si rompono abbastanza rapidamente.

Se si dispone di 5 blocchi di 5 caratteri, si dispone di combinazioni 36^25, che è maggiore di 2^128, quindi è possibile utilizzare uno degli algoritmi di firma digitale standard che genera un 128 bit, quindi convertire tale valore in base 36.

15

Fatevi un public/private key pair. Genera sequence numbers (10000, 20000, 30000, 40000, ....) che presentano alcune caratteristiche identificative (ad esempio, divisibile per 10000). Cripta quel numero usando la tua chiave privata. Codifica tale valore utilizzando un sistema leggibile dall'uomo (base 32 o 64) e separa i valori in gruppi per facilitare l'analisi da parte delle persone. Distribuisci il numero seriale codificato con ogni vendita della tua app.

Da qualche parte nell'app, la chiave pubblica è nascosta. Quando un utente immette un numero seriale codificato, per prima cosa lo decodifica in binario. Utilizzare la chiave pubblica per decrittografarlo. Verificare che sia divisibile per 10000.

La parte difficile è nell'implementazione - nascondere la chiave pubblica nell'app in modo che non possa essere sostituita facilmente. Scegliere una sequenza che puoi identificare facilmente, ma senza esaurire i valori. Obfuscating l'app in modo che qualcuno non possa saltare facilmente l'intero controllo. ecc ...

+0

Bene, se sei in grado di decrittografarlo, è già una garanzia che è stato firmato digitalmente dalla tua chiave privata, quindi non importa quale sia il contenuto, se il tuo algoritmo di decodifica è in grado di capire la decrittazione corretta. –

+1

La maggior parte delle tecniche di decrittografia consente di eseguire qualsiasi valore tramite l'algoritmo di decrittografia. Per la maggior parte degli input casuali, otterrai output casuali. Con molti algoritmi, dato un frammento di dati casuali, c'è una chiave che decodificherà quella stringa su qualsiasi altra stringa. – Eclipse

3

È possibile utilizzare un generatore di numeri casuali e memorizzare le uscite in un database. In caso di richiesta di attivazione, basta controllare se la seriale è nel database e contrassegnare il seriale come "usato".

Naturalmente, questo richiede una connessione a Internet, ma è buono contro il metodo "compra una volta, usa molte, molte volte" e in caso di chiamata di supporto, è possibile riattivare quella seriale per un'altra reinstallazione.

Modifica successiva: è inoltre necessario utilizzare per la verifica di Internet una connessione crittografata e autenticata, come quella HTTPS.

3

Un GUID ("Globally Unique Identifier") potrebbe essere un modo semplice per risolvere questo:

http://en.wikipedia.org/wiki/Globally_Unique_Identifier

GUID contengono 16 byte e sono più comunemente scritto nel testo come una sequenza di cifre esadecimali, come :

3F2504E0-4F89-11D3-9A0C-0305E82C3301 

E la maggior parte dei linguaggi di programmazione dovrebbe essere in grado di generare un GUID con una delle librerie disponibili.

+0

Downvoted, perché i GUID non vengono generati "casualmente". Sono garantiti per essere unici - non casuali, e quindi non sono adatti per l'uso come numeri seriali. – ine

+8

La parola "casuale" non appare nelle specifiche. 'Seriale', tuttavia, lo fa, e questo è addirittura l'opposto di casuale. Quindi qual è la tua ragione per le downvoting? – mjn

+0

La prima cifra del terzo gruppo, nell'esempio "1", indica l'algoritmo utilizzato. La versione 1 dovrebbe contenere l'indirizzo MAC dell'entità generatrice, mentre la versione 4 è basata su un numero pseudo-casuale. – sisve