Come vengono generate le chiavi di licenza del software?


361

Le chiavi di licenza sono lo standard defacto come misura antipirateria. Ad essere sincero, questo mi sembra (in) Security Through Obscurity , anche se non ho davvero idea di come vengano generati i codici di licenza. Qual è un buon esempio (sicuro) di generazione di chiavi di licenza? Quale primitiva crittografica (se presente) stanno usando? È un messaggio digest? In tal caso, quali dati sarebbero stati sottoposti a hashing? Quali metodi utilizzano gli sviluppatori per rendere difficile per i cracker costruire i propri generatori di chiavi? Come vengono creati i generatori di chiavi?


8
+1 domanda interessante, forse un risponditore può pubblicare link ad alcune buone risorse su questo argomento per ulteriori letture? per favore :)
Jacob

44
Tutti gli schemi DRM sono essenzialmente schemi di oscurità, poiché tutto il codice e i dati necessari per l'esecuzione del programma sono stati forniti all'utente. Lo schema può essere reso arbitrariamente offuscato per rendere difficile l'applicazione di patch, ma è una certezza che il codice può essere corretto per evitare qualsiasi controllo.
Caf

5
Le chiavi del CD sono davvero sicurezza attraverso l'oscurità. Esistono diversi modi per crearli, ma tutti si basano necessariamente sull'integrazione di alcuni segreti nel programma necessari per verificare la chiave.
Nick Johnson,

4
Ora vengono chiamati codici " Product Key" o " License Key", poiché la maggior parte dei software che li utilizza ha maggiori probabilità di essere consegnati online che tramite cd.
Joel Coehoorn,

4
Mi piacerebbe creare un'app un giorno in cui dovrei preoccuparmi di questo, un sogno d'infanzia di sorta. Le app Web non lo tagliano.
Znarkus,

Risposte:


268

Per le chiavi CD di vecchia scuola, si trattava solo di creare un algoritmo per cui le chiavi CD (che potrebbero essere qualsiasi stringa) sono facili da generare e facili da verificare, ma il rapporto tra chiavi CD valide e CD non valide -keys è così piccolo che è improbabile che indovinare casualmente le chiavi del CD ne dia una valida.

MODO SCORRETTO PER FARLO:

Starcraft e Half-life hanno entrambi utilizzato lo stesso checksum, dove la 13a cifra ha verificato le prime 12. Quindi, puoi inserire qualsiasi cosa per le prime 12 cifre e indovinare la 13 (ci sono solo 10 possibilità), portando al famigerato1234-56789-1234

L'algoritmo per la verifica è pubblico e assomiglia a questo:

x = 3;
for(int i = 0; i < 12; i++)
{
    x += (2 * x) ^ digit[i];
}
lastDigit = x % 10;

MODO CORRETTO PER FARLO

Windows XP prende molte informazioni, le crittografa e mette la codifica lettera / numero su un adesivo. Ciò ha consentito a MS di verificare la chiave e ottenere contemporaneamente il tipo di prodotto (Home, Professional, ecc.). Inoltre, richiede l'attivazione online.
L'algoritmo completo è piuttosto complesso, ma ben delineato in questo documento (completamente legale!), Pubblicato in Germania.

Ovviamente, qualunque cosa tu faccia, a meno che tu non stia offrendo un servizio online (come World of Warcraft ), qualsiasi tipo di protezione dalla copia è solo una bancarella: sfortunatamente, se si tratta di un valore che vale la pena, qualcuno romperà (o almeno eluderà ) l'algoritmo chiave CD e tutte le altre protezioni del copyright.

MODO REAL CORRETTO PER FARLO:

Per i servizi online, la vita è un po 'più semplice, poiché anche con il file binario devi autenticarti con i loro server per utilizzarlo (ad es. Avere un account WoW). L'algoritmo chiave CD di World of Warcraft - utilizzato, ad esempio, per l'acquisto di carte playtime - probabilmente ha questo aspetto:

  1. Genera un numero casuale molto grande crittograficamente sicuro.
  2. Conservalo nel nostro database e stampalo sulla scheda.

    Quindi, quando qualcuno inserisce un numero di carta del tempo di gioco, controlla se si trova nel database e, se lo è, associa quel numero all'utente corrente in modo che non possa mai essere riutilizzato.

Per i servizi online, non vi è alcun motivo per non utilizzare il suddetto schema; l'utilizzo di qualsiasi altra cosa può causare problemi .


47
Mathematica ha un processo interessante. Il prodotto viene fornito con una chiave univoca e il file di installazione genera una seconda chiave univoca (basata sull'hardware). Entrambe queste chiavi devono essere inserite in un modulo online con il tuo nome e le informazioni di registrazione, quindi ti inviano la chiave reale basata su quelle due chiavi che sbloccano effettivamente il software, ma solo per quella chiave di prodotto specifica e sul tuo hardware specifico.
Dan,

18
Heh, non ho mai saputo della 1234-56789-1234chiave di Starcraft, ma ricordo che ci sono voluti solo circa cinque minuti per "forzare" il verificatore schiacciando la tastiera e riprovando.
fmark

18
Ricordo anche alcuni prodotti Microsoft in passato che consentono di utilizzare 111-1111111 come cdkey valido (Visual Studio 6.0)
hannson,

25
Non ho mai saputo di 1234-56789-1234. Invece, abbiamo usato tredici tre! 3333333333333
ErikTJ,

33
Il problema con l'attivazione online è che siamo tutti fregati se / quando l'editore esce dal mercato. Per favore, non farlo. Questo succede, e un giorno potrebbe succedere anche a Microsoft.
Brad,

56

Quando originariamente ho scritto questa risposta, si supponeva che la domanda riguardasse la convalida "offline" delle chiavi di licenza. La maggior parte delle altre risposte riguarda la verifica online, che è significativamente più facile da gestire (la maggior parte della logica può essere eseguita sul lato server).

Con la verifica offline la cosa più difficile è garantire che sia possibile generare un numero enorme di chiavi di licenza uniche e mantenere comunque un algoritmo avanzato che non è facilmente compromesso (come una semplice cifra di controllo)

Non sono molto esperto in matematica, ma mi ha colpito il fatto che un modo per farlo è usare una funzione matematica che traccia un grafico

La linea tracciata può contenere (se usi una frequenza abbastanza fine) migliaia di punti unici, quindi puoi generare chiavi selezionando punti casuali su quel grafico e codificando i valori in qualche modo

inserisci qui la descrizione dell'immagine

Ad esempio, tracciamo questo grafico, selezioniamo quattro punti e li codifichiamo in una stringa come "0, -500; 100, -300; 200, -100; 100.600"

Cifreremo la stringa con una chiave nota e fissa (orribilmente debole, ma serve a uno scopo), quindi convertiremo i byte risultanti tramite Base32 per generare la chiave finale

L'applicazione può quindi invertire questo processo (base32 in numero reale, decrittografare, decodificare i punti) e quindi verificare che ciascuno di questi punti sia sul nostro grafico segreto.

È una quantità abbastanza piccola di codice che consentirebbe di generare un numero enorme di chiavi univoche e valide

È comunque molta sicurezza per oscurità. Chiunque si prenda il tempo per disassemblare il codice sarebbe in grado di trovare la funzione grafica e le chiavi di crittografia, quindi prendere in giro un generatore di chiavi, ma è probabilmente abbastanza utile per rallentare la pirateria informale.


6
No, Erik no. X è un numero intero e Y è il piano della funzione.
Giosuè,

Questo non è diverso da quanto funzionava la navigazione satellitare pre-GPS! youtube.com/watch?v=BBOsQBuCJfs
Brad

34

Consulta questo articolo sulla verifica della chiave parziale che copre i seguenti requisiti:

  • Le chiavi di licenza devono essere abbastanza facili da digitare.

  • Dobbiamo essere in grado di inserire nella lista nera (revocare) una chiave di licenza in caso di storni di addebito o acquisti con carte di credito rubate.

  • Nessuna "telefonata a casa" per testare le chiavi. Sebbene questa pratica stia diventando sempre più diffusa, non la apprezzo ancora come utente, quindi non chiederò ai miei utenti di tollerarla.

  • Non dovrebbe essere possibile per un cracker smontare la nostra applicazione rilasciata e produrre un "keygen" funzionante da essa. Ciò significa che la nostra applicazione non testerà completamente una chiave per la verifica. Solo una parte della chiave deve essere testata. Inoltre, ogni versione dell'applicazione dovrebbe testare una parte diversa della chiave, in modo che una chiave fasulla basata su una versione precedente non funzionerà su una versione successiva del nostro software.

  • Importante: non dovrebbe essere possibile per un utente legittimo digitare accidentalmente una chiave non valida che sembrerà funzionare ma non funzionerà su una versione futura a causa di un errore tipografico.


21

Non ho alcuna esperienza con ciò che le persone effettivamente fanno per generare chiavi CD, ma (supponendo che tu non voglia seguire la strada dell'attivazione online) qui ci sono alcuni modi in cui si potrebbe creare una chiave:

  • Richiedi che il numero sia divisibile per (diciamo) 17. Prova a indovinare, se hai accesso a molte chiavi, ma la maggior parte delle potenziali stringhe non sarà valida. Simile richiederebbe che il checksum della chiave corrisponda a un valore noto.

  • È necessario che la prima metà della chiave, se concatenata con un valore noto, esegua l'hashing fino alla seconda metà della chiave. Meglio, ma il programma contiene ancora tutte le informazioni necessarie per generare le chiavi e per convalidarle.

  • Genera chiavi crittografando (con una chiave privata) un valore noto + nonce. Questo può essere verificato decodificando usando la chiave pubblica corrispondente e verificando il valore noto. Il programma ora dispone di informazioni sufficienti per verificare la chiave senza essere in grado di generare chiavi.

Questi sono ancora tutti aperti all'attacco: il programma è ancora lì e può essere patchato per aggirare il controllo. Cleverer potrebbe essere quello di crittografare parte del programma usando il valore noto dal mio terzo metodo, piuttosto che archiviare il valore nel programma. In questo modo dovresti trovare una copia della chiave prima di poter decrittografare il programma, ma è comunque vulnerabile alla copia dopo la decrittografia e al fatto che una persona prenda la propria copia legittima e la usi per consentire a tutti gli altri di accedere al software.


9
Vorrei davvero chi era venuto con il 'numero utilizzato una volta' cosa che non aveva scelto Nonce come nome, date le ahem connotazioni negative che mi fanno ridacchiare ogni volta che qualcuno suggerisce di criptare uno.
Ed James,

2
Si noti che la terza opzione non funziona con i cifratori chiave simmetrici poiché l'attaccante potrebbe semplicemente invertire il test sul testo normale, generare qualcosa che passa e quindi crittografarlo con il tasto (noto) e il codice (noto). L'uso di un cifratore per birra fatta in casa non è una soluzione perché se puoi farlo da solo, dovresti trovare un lavoro presso l'NSA.
BCS,

@BCS: Mi dispiace, avrei dovuto essere più chiaro sull'uso della crittografia a chiave pubblica.
Andrew Aylett,

Utilizzare uno schema di firma, non uno schema di crittografia per la versione a chiave pubblica. (La firma RSA assomiglia un po 'alla "crittografia con la chiave pubblica", ma non è assolutamente la stessa cosa. Esistono altri schemi di firma che non hanno uno schema di crittografia associato, come DSA.)
Paŭlo Ebermann,

Il problema con la crittografia a chiave pubblica è che le chiavi (e quindi i periodici) devono essere lunghe. Oggi una coppia di chiavi RSA a 512 bit non è difficile da decifrare. Confronta con le chiavi di WinXP (5 gruppi di 5 caratteri alfanumerici) che hanno solo 128 bit di entropia ma ancora un dolore da digitare.
finnw

17

Le chiavi CD non sono molto sicure per qualsiasi cosa non collegata in rete, quindi tecnicamente non devono essere generate in modo sicuro. Se sei su .net, puoi quasi andare con Guid.NewGuid ().

Il loro uso principale al giorno d'oggi è per il componente Multiplayer, in cui un server può verificare la chiave CD. Per questo, non è importante quanto sia stato generato in modo sicuro mentre si riduce a "Cerca tutto ciò che è passato e controlla se qualcun altro lo sta già utilizzando".

Detto questo, potresti voler utilizzare un algoritmo per raggiungere due obiettivi:

  • Avere un checksum di qualche tipo. Ciò consente al programma di installazione di visualizzare il messaggio "La chiave non sembra valida", al solo scopo di rilevare errori di battitura (L'aggiunta di un tale controllo nell'installer in realtà significa che scrivere un generatore di chiavi è banale in quanto l'hacker ha tutto il codice di cui ha bisogno. controllare e basarsi esclusivamente sulla convalida lato server disabilita tale controllo, a rischio di infastidire i clienti legali che non comprendono perché il server non accetta la loro chiave CD poiché non sono a conoscenza dell'errore di battitura)
  • Lavora con un sottoinsieme limitato di personaggi. Prova a digitare una chiave CD e indovina "È un 8 o un B? Un 1 o un I? Un Q o un O o uno 0?" - usando un sottoinsieme di caratteri / cifre non ambigui si elimina quella confusione.

Detto questo, vuoi comunque una grande distribuzione e un po 'di casualità per evitare un pirata semplicemente indovinando una chiave valida (valida nel tuo database ma ancora in una scatola su uno scaffale del negozio) e rovinando un cliente legittimo che capita di acquistare quella scatola .


facilmente risolto da un buon servizio clienti - Box shot + Prova d'acquisto = Blocca utente illegale, concedi l'accesso al secondo utente.
alexanderpas,

1
ecco alcune considerazioni extra sulle chiavi CD codinghorror.com/blog/2007/12/software-registration-keys.html
Richard Chambers,

10

Se non sei particolarmente interessato alla lunghezza della chiave, un metodo abbastanza provato e vero è l'uso della crittografia della chiave pubblica e privata.

Essenzialmente hanno una sorta di nonce e una firma fissa.

Ad esempio: 0001-123456789

Dove 0001 è il tuo nonce e 123456789 è la tua firma fissa.

Quindi crittografalo utilizzando la tua chiave privata per ottenere la chiave del CD che è simile a: ABCDEF9876543210

Quindi distribuire la chiave pubblica con l'applicazione. La chiave pubblica può essere utilizzata per decrittografare la chiave CD "ABCDEF9876543210", di cui si verifica quindi la parte della firma fissa.

Questo quindi impedisce a qualcuno di indovinare quale sia la chiave del CD per il nonce 0002 perché non ha la chiave privata.

L'unico lato negativo è che le chiavi del CD saranno piuttosto lunghe quando si usano chiavi private / pubbliche di dimensioni 1024 bit. Devi anche scegliere un nonce abbastanza a lungo in modo da non crittografare una quantità banale di informazioni.

Il lato positivo è che questo metodo funzionerà senza "attivazione" e puoi usare cose come un indirizzo e-mail o il nome del licenziatario come nonce.


1
Si noti che il mio esempio sottovaluta gravemente la lunghezza della chiave. Questi schemi in genere richiedono la codifica Base64 e la distribuzione copia / incolla, ma consentono quasi impossibile indovinare chiavi che non sono legate a una macchina e non richiedono l'attivazione (due cose molto importanti per molti tipi di clienti)
userx

3
Invece di usare RSA, puoi usare le curve ellittiche. Usano tasti più corti e la loro lunghezza del blocco è inferiore. Leggendo il Wiki, sembra che un ECC a 256 bit sia sicuro come AES 128.
xanatos

Si noti che le firme digitali e la "crittografia mediante chiave privata" non sono la stessa cosa. In RSA sembrano simili (anche se non lo sono, a causa di diversi schemi di riempimento), altri schemi di firma non hanno nemmeno uno schema di crittografia corrispondente.
Paŭlo Ebermann,

@xanatos, 256 bit è ancora troppo lungo per essere inserito manualmente. Considera le chiavi di 25 caratteri utilizzate da WinXP: hanno solo 128 bit di entropia.
fin

1
@Mark - Una firma è in genere solo un hash crittografato. Puoi usare la crittografia o la firma, il mio metodo funziona allo stesso modo. Stai solo cercando di creare una chiave di licenza che non può essere facilmente generata senza la chiave privata e può essere verificata dalla chiave pubblica. Questo potrebbe essere l'intero messaggio crittografato (e si verifica che parte del suo contenuto corrisponda a qualcosa di magico) o semplicemente un messaggio firmato (e si verifica che la firma sia valida). Dipende dalla tua implementazione.
userx

9

Il sistema chiave deve avere diverse proprietà:

  • pochissime chiavi devono essere valide
  • le chiavi valide non devono essere derivabili anche dato tutto ciò che l'utente ha.
  • una chiave valida su un sistema non è una chiave valida su un altro.
  • altri

Una soluzione che dovrebbe darti questi sarebbe quella di utilizzare uno schema di firma a chiave pubblica . Inizia con un "hash di sistema" (ad esempio, prendi i mac su qualsiasi scheda di rete, ordinati e le informazioni sull'ID CPU, oltre ad altre cose, concatena tutto insieme e prendi un MD5 del risultato (davvero non vuoi essere gestione delle informazioni di identificazione personale se non è necessario)) aggiungere il numero di serie del CD e rifiutare l'avvio, a meno che una chiave di registro (o alcuni file di dati) non disponga di una firma valida per il BLOB. L'utente attiva il programma inviandoti il ​​BLOB e rispedisci la firma.

I potenziali problemi includono che stai offrendo di firmare praticamente qualsiasi cosa, quindi devi presumere che qualcuno eseguirà un testo in chiaro scelto e / o attacchi di testo cifrato scelti . Ciò può essere mitigato controllando il numero di serie fornito e rifiutando di gestire la richiesta da quelli non validi e rifiutando di gestire più di un determinato numero di query da un determinato numero di serie in un intervallo (diciamo 2 all'anno)

Vorrei sottolineare alcune cose: in primo luogo, un utente malintenzionato esperto e determinato sarà in grado di bypassare qualsiasi sicurezza nelle parti a cui hanno accesso illimitato ( cioè tutto sul CD), il meglio che puoi fare su quell'account è rendere più difficile ottenere un accesso illegittimo piuttosto che ottenere un accesso legittimo. In secondo luogo, non sono un esperto, quindi potrebbero esserci gravi difetti in questo schema proposto.


1

Esistono anche comportamenti DRM che incorporano più passaggi del processo. Uno degli esempi più noti è uno dei metodi di Adobe per la verifica di un'installazione della loro Creative Suite. Viene utilizzato il metodo tradizionale chiave CD discusso qui, quindi viene chiamata la linea di supporto di Adobe. La chiave del CD viene consegnata al rappresentante Adobe e restituiscono un numero di attivazione che deve essere utilizzato dall'utente.

Tuttavia, nonostante sia suddiviso in più fasi, questo è preda degli stessi metodi di cracking utilizzati per il normale processo. Il processo utilizzato per creare una chiave di attivazione che viene confrontata con la chiave CD originale è stato rapidamente scoperto e sono stati creati generatori che incorporano entrambe le chiavi.

Tuttavia, questo metodo esiste ancora come modo per gli utenti senza connessione a Internet di verificare il prodotto. Andando avanti, è facile vedere come questi metodi sarebbero eliminati man mano che l'accesso a Internet diventa onnipresente.


1

Tutti i CD copiano solo algoritmi di protezione che contraddicono gli utenti onesti senza fornire alcuna protezione contro la pirateria.

Il "pirata" deve solo avere accesso a un cd legittimo e al suo codice di accesso, quindi può fare n copie e distribuirle.

Non importa quanto sia crittograficamente sicuro il codice, è necessario fornirlo con il CD in testo normale o un utente legittimo non può attivare il software.

Gli schemi più sicuri coinvolgono l'utente che fornisce al fornitore del software alcuni dettagli della macchina che eseguirà il software (numeri di serie della CPU, indirizzi mac, indirizzo IP ecc.) Oppure richiedono l'accesso online per registrare il software sul sito Web dei fornitori e in cambio ricevi un token di attivazione. La prima opzione richiede molta amministrazione manuale e vale la pena solo per software di valore molto elevato, la seconda opzione può essere falsificata ed è assolutamente irritante se si ha un accesso limitato alla rete o si è bloccati dietro un firewall.

Nel complesso è molto più semplice stabilire un rapporto di fiducia con i tuoi clienti!


0

Puoi utilizzare e implementare l'API di licenze sicure da ( https://www.nuget.org/packages/SystemSoulLicense/ ) molto facilmente nei tuoi progetti software utilizzandola, (devi scaricare l'applicazione desktop per creare una licenza sicura da https: / /www.systemsoulsoftwares.com/ ) 1. Crea UID univoco per software client basato su Hardware di sistema (CPU, scheda madre, disco rigido) (UID funge da chiave privata per quel sistema univoco) 2. Permette di inviare una stringa di licenza crittografata molto facilmente al sistema client, Verifica la stringa di licenza e funziona solo su quel particolare sistema 3. Questo metodo consente agli sviluppatori software o alle aziende di memorizzare ulteriori informazioni su software / sviluppatore / servizi / funzioni distributore / client 4. Offre il controllo per bloccare e sbloccare le funzionalità del software client, risparmiando tempo per gli sviluppatori creazione di più versioni per lo stesso software con modifica delle funzionalità 5. Si preoccupa anche della versione di prova per un numero qualsiasi di giorni 6. Protegge la cronologia delle licenze controllando DateTime online durante la registrazione 7. Sblocca tutte le informazioni hardware per gli sviluppatori 8.Ha tutte le funzioni pre-build e personalizzate a cui gli sviluppatori possono accedere in ogni processo di licenza per rendere il codice sicuro più complesso

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.