security eulas - Come vengono generate le chiavi di licenza del software?





wiki license (9)


I CD-Keys non sono una grande sicurezza per qualsiasi materiale non in rete, quindi tecnicamente non è necessario generarli in modo sicuro. Se sei su .net, puoi quasi andare con Guid.NewGuid ().

Al giorno d'oggi il loro uso principale è 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 "Ricerca di qualsiasi cosa venga passato e controllare se qualcun altro lo sta già utilizzando".

Detto questo, potresti voler usare 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", solo per rilevare errori di battitura (l'aggiunta di tale controllo nell'installer significa in realtà che scrivere un generatore di chiavi è banale in quanto l'hacker ha tutto il codice di cui ha bisogno. controllare e affidarsi esclusivamente alle disabilitazioni di convalida sul lato server che controllano, a rischio di infastidire i clienti legali che non capiscono perché il server non accetta la propria chiave CD in quanto non sono a conoscenza dell'errore di battitura)
  • Lavora con un sottoinsieme limitato di caratteri. Cercando di digitare una chiave CD e indovinando "Si tratta di un 8 o di un B? A 1 o di un? A Q o di un O o di uno 0?" - usando un sottoinsieme di caratteri / cifre non ambigui, elimini quella confusione.

Detto questo, vuoi ancora una grande distribuzione e un po 'di casualità per evitare che un pirata indovini semplicemente una chiave valida (valida nel tuo database ma ancora in una scatola sullo scaffale di un negozio) e scopare un cliente legittimo che capita di comprare quella scatola .

Le chiavi di licenza sono lo standard defacto come misura antipirateria. Ad essere onesti, questo mi colpisce come (in) Security Through Obscurity , anche se non ho idea di come vengano generate le chiavi di licenza. Qual è un buon esempio (sicuro) di generazione della chiave di licenza? Quale primitiva crittografica (se esiste) sta usando? È un messaggio digest? In caso affermativo, quali dati avrebbero hashing? Quali metodi impiegano gli sviluppatori per rendere difficile ai cracker costruire i propri generatori di chiavi? Come vengono creati i generatori di chiavi?




Esistono anche comportamenti DRM che incorporano più passaggi del processo. Uno degli esempi più noti è uno dei metodi di Adobe per verificare l'installazione della loro Creative Suite. Viene utilizzato il tradizionale metodo CD Key qui discusso, 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, pur essendo suddiviso in passaggi, questo cade preda degli stessi metodi di cracking utilizzati per il normale processo. Il processo utilizzato per creare una chiave di attivazione confrontata con la chiave CD originale è stato rilevato rapidamente e sono stati creati i generatori che incorporano entrambe le chiavi.

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




Non ho alcuna esperienza con ciò che le persone effettivamente fanno per generare le chiavi del CD, ma (presumendo che tu non voglia intraprendere la strada dell'attivazione online) ecco alcuni modi in cui si potrebbe fare una chiave:

  • Richiedere che il numero sia divisibile per (diciamo) 17. Trivial da indovinare, se si ha 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.

  • Richiedere che la prima metà della chiave, quando concatenata con un valore noto, si abbassi alla seconda metà della chiave. Meglio, ma il programma contiene ancora tutte le informazioni necessarie per generare chiavi e per convalidarle.

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

Questi sono ancora tutti aperti agli attacchi: il programma è ancora lì e può essere riparato per bypassare il controllo. Cleverer potrebbe essere quello di crittografare parte del programma utilizzando il valore noto dal mio terzo metodo, piuttosto che memorizzare il valore nel programma. In questo modo dovresti trovare una copia della chiave prima di poter decifrare il programma, ma è ancora vulnerabile alla copia una volta decrittografata e ad una persona che prende la sua copia legittima e la usa per consentire a tutti gli altri di accedere al software.




Se non si è particolarmente interessati alla lunghezza della chiave, un metodo piuttosto provato e vero è l'uso della crittografia a chiave pubblica e privata.

Essenzialmente hanno un qualche tipo di nonce e una firma fissa.

Ad esempio: 0001-123456789

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

Quindi crittografalo usando la tua chiave privata per ottenere la tua chiave CD che è qualcosa come: ABCDEF9876543210

Quindi distribuisci la chiave pubblica con la tua applicazione. La chiave pubblica può essere utilizzata per decodificare la chiave CD "ABCDEF9876543210", che viene quindi verificata la parte di firma fissa di.

Ciò impedisce quindi a qualcuno di indovinare qual è la chiave del CD per il nonce 0002 perché non hanno la chiave privata.

L'unico aspetto negativo è che le chiavi del tuo CD saranno piuttosto lunghe quando si usano le chiavi private / pubbliche a 1024 bit. È inoltre necessario scegliere un nonce abbastanza a lungo in modo da non crittografare una quantità insignificante di informazioni.

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




Tutti i CD copiano solo gli algoritmi di protezione degli 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 sicuro sia il codice crittograficamente protetto, è necessario fornirlo con il CD in testo normale o un utente legittimo non può attivare il software.

Gli schemi più sicuri prevedono che l'utente fornisca al fornitore del software alcuni dettagli della macchina che eseguirà il software (numeri di serie della cpu, indirizzi mac, indirizzo IP ecc.) O richieda l'accesso online per registrare il software sul sito Web del fornitore e in cambio riceverai un gettone di attivazione. La prima opzione richiede molta amministrazione manuale e vale solo per software di valore molto elevato, la seconda opzione può essere falsificata ed è assolutamente esasperante se si dispone di un accesso limitato alla rete o se si è bloccati dietro un firewall.

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




Per le chiavi CD della vecchia scuola, si trattava solo di creare un algoritmo per il quale i tasti del CD (che potrebbero essere qualsiasi stringa) sono facili da generare e facili da verificare, ma il rapporto tra chiavi CD valide e CD non validi -I tasti sono così piccoli che è improbabile che indovinelli casualmente le chiavi del CD ti diano una valida.

MODO SCORRETTO PER FARLO:

Sia Starcraft che Half-life hanno entrambi utilizzato lo stesso checksum, in cui la 13 ° cifra ha verificato il primo 12. Quindi, è possibile inserire qualsiasi valore per le prime 12 cifre, e indovinare il 13 (ci sono solo 10 possibilità), portando al famigerato 1234-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 richiede un bel po 'di informazioni, lo crittografa e inserisce la codifica di lettere / numeri su un adesivo. Ciò ha permesso a MS di verificare la tua chiave e ottenere il tipo di prodotto (casa, professionista, ecc.) Allo stesso tempo. Inoltre, richiede l'attivazione online.
L'algoritmo completo è piuttosto complesso, ma delineato bene in this (completamente legale!), Pubblicato in Germania.

Ovviamente, non importa quello che fai, a meno che tu non stia offrendo un servizio online (come World of Warcraft ), qualsiasi tipo di protezione è solo uno stallo: sfortunatamente, se si tratta di un gioco che vale la pena, qualcuno si romperà (o perlomeno eluderà ) l'algoritmo della chiave CD e tutte le altre protezioni del copyright.

VERO MODO CORRETTO PER FARLO:

Per i servizi online, la vita è un po 'più semplice, dal momento che anche con il file binario è necessario autenticarsi con i propri server per utilizzarli (ad esempio, avere un account WoW). L'algoritmo della chiave CD per World of Warcraft - usato, ad esempio, quando si acquistano le carte per giocare a tempo pieno - probabilmente assomiglia a questo:

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

    Quindi, quando qualcuno immette un numero di scheda di ricreazione, controlla se si trova nel database e, se lo è, associa quel numero con l'utente corrente in modo che non possa mai più essere utilizzato.

Per i servizi online, non vi è alcun motivo per non utilizzare lo schema di cui sopra; usare qualcos'altro può portare a problemi .




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

Con la verifica offline la cosa più difficile è assicurarti di poter generare un numero enorme di chiavi di licenza univoche e mantenere comunque un algoritmo forte che non è facilmente compromesso (come una semplice cifra di controllo)

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

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

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

Cifreremo la stringa con una chiave conosciuta e fissa (orribilmente debole, ma ha uno scopo), quindi convertiamo i byte risultanti con Base32 per generare la chiave finale

L'applicazione può quindi invertire questo processo (da base32 a numero reale, decrittografare, decodificare i punti) e quindi verificare che ognuno di questi punti si trovi sul nostro grafico segreto.

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

È comunque molta sicurezza per oscurità. Chiunque abbia il tempo di 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 molto utile per rallentare la pirateria casuale.




Il sistema chiave deve avere diverse proprietà:

  • pochissime chiavi devono essere valide
  • le chiavi valide non devono essere derivabili anche se 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 usare uno schema di firma della chiave pubblica . Inizia con un "hash di sistema" (ad esempio prendi i mac su qualsiasi NIC, ordinata, e le informazioni sull'ID della CPU, più alcune altre cose, concatenalo insieme e prendi un MD5 del risultato (non vuoi davvero essere gestione di informazioni personali identificabili se non è necessario)) aggiungere il numero di serie del CD e rifiutare l'avvio a meno che alcune chiavi di registro (o alcuni file di dati) abbiano una firma valida per il blob. L'utente attiva il programma inviando il BLOB all'utente e restituisce la firma.

I problemi potenziali includono che stai offrendo di firmare praticamente qualsiasi cosa quindi devi assumere 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 parte di quelli non validi e rifiutando di gestire più di un dato numero di query da un determinato s / n in un intervallo (ad esempio 2 all'anno)

Dovrei sottolineare alcune cose: in primo luogo, un attaccante esperto e determinato sarà in grado di aggirare 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. Secondo, non sono un esperto, quindi potrebbero esserci gravi difetti in questo schema proposto.




Processo in due fasi -

1. Crea la pagina di disconnessione
2. Crea un bean di sessione con un metodo di disconnessione

PASSO A: La pagina di disconnessione

<div class="mytext">
    <p>Hello #{userSession.username}, </p>
    <p><h:outputText value="It doesn't seem you're logged in anyway..." rendered="#{!userSession.userLoggedIn}" /></p>
</div>
    <h:form class="mytext" rendered="#{userSession.userLoggedIn}" >
        <h:panelGrid columns="2"  >
            <h:outputLabel value="Do you want to logout?" for="logout"  />
            <p:commandButton value="Logout" id="logout" action="#{userSession.logout}" />                                      
        </h:panelGrid>
    </h:form>

PASSAGGIO B: codice di supporto del bean di sessione (snippet)

public String logout() {
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    session.invalidate();
    return "/index?faces-redirect=true";
}

public boolean isUserLoggedIn() {
    String user = this.getUsername();
    boolean result = !((user == null)|| user.isEmpty());
    return result;
}

/** Get the login username if it exists */
public String getUsername() {
    String user = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
    return user;
}    




security cryptography license-key