Se non c'è un reale bisogno di sicurezza, ecco un generatore di numeri seriali molto veloce, con un correttore:
- Utente un contatore. Inizializza a 0. Quando vuoi un nuovo numero di serie, incrementa il contatore di 1000; il nuovo valore del contatore è il numero di serie. Il correttore funziona così: un numero di serie è valido se termina con tre zeri. Solo un numero su 1000 sarà accettato dal controllore.
Se questa soluzione non ti soddisfa, allora fai hai bisogno di sicurezza, e questo richiede la crittografia.
La soluzione crittograficamente sicura deve avere i numeri seriali firmati: il numero di serie è la codifica di alcuni payload (ad esempio un contatore di tutti i numeri seriali che hai generato) e una firma sul payload. Il generatore ha una chiave privata, che usa per calcolare le firme; il controllore conosce solo la chiave pubblica corrispondente. Il problema con questa configurazione non riguarda in realtà il tempo di verifica, anche in Javascript; piuttosto, è la taglia della firma che è un problema. Suppongo che il numero seriale sarà, a un certo punto, digitato da un utente. La dimensione minima teorica per una firma crittograficamente sicura è di circa 80 bit (poiché le firme possono essere verificate solo con la chiave pubblica, un utente malintenzionato potrebbe provare tutte le possibili sequenze di bit e di solito richiediamo un livello di sicurezza di almeno 2 80 ). Tuttavia, le firme più piccole tra gli "schemi di sicurezza presunti" sono più vicine a 160 bit (con BLS , che utilizza un accoppiamento, che è un po 'complesso da implementare) o 320 bit (con DSA o ECDSA ). C'è un po 'di lavoro sui sistemi di firma con firme più brevi ( Quartz , o McEliece-Niederreiter ) ma c'è parecchia polemica sulla loro sicurezza.
Anche con lettere maiuscole e cifre (36 possibili caratteri, e ci sono sia "I" che "1", e anche "O" e "0"), una firma a 160 bit utilizzerà 31 caratteri. Insieme al payload, si otterranno numeri seriali di lunghezza pari o superiore a 35, che è probabilmente troppo per un utente medio da digitare (ma non con un ampio margine, una firma a 80 bit si adatterebbe bene). p>
Se non usi uno schema di firma, allora devi essere consapevole che un aggressore ragionevolmente determinato sarà in grado, attraverso un certo disassemblaggio, di eludere il controllore, o anche di imparare abbastanza per essere in grado per produrre i propri numeri di serie (che il correttore accetterà volentieri). A quel punto, non otterrete una sicurezza quantificata: non sarete in grado di dire: "il mio piano è sicuro fino a un budget di 3,8 miliardi di dollari". Piuttosto, andrà come: "il mio schema è sicuro fino a quando uno studente abbastanza spiritoso e annoiato arriva, inverte il codice di controllo e pubblica il risultato su Facebook".
Il classico schema non proprio sicuro sarebbe simile a questo:
- Usa il contatore dello schema precedente (quello con le estremità con tre zeri). Codificalo come un blocco a 64 bit. Criptare quel blocco con una chiave simmetrica con hardcoded, usando un codice a blocchi. Il correttore conosce la chiave e verifica il numero di serie decodificandolo (con la stessa chiave simmetrica codificata) e osservando gli zeri finali.
Questo non è più sicuro del normale contatore, ma almeno i numeri seriali saranno casuali. Con un alfabeto di 34 caratteri (cifre e lettere maiuscole eccetto "O" e "I"), un blocco a 64 bit richiede 13 lettere, che è probabilmente accettabile (un tipico numero seriale Microsoft ha 25 lettere). Per la cifratura a 64 bit, raccomando XTEA , che dovrebbe essere abbastanza veloce e semplice da implementare.