Domanda

Come posso creare un codice Product Key per la mia applicazione C #?

Devo creare una chiave di prodotto (o licenza) che aggiorno ogni anno. Inoltre, devo crearne uno per le versioni di prova.

  

Correlato:

     
È stato utile?

Soluzione

Puoi fare qualcosa come creare un record che contenga i dati che desideri autenticare nell'applicazione. Ciò potrebbe includere tutto ciò che desideri, ad es. funzioni del programma da abilitare, data di scadenza, nome dell'utente (se si desidera associarlo a un utente). Quindi crittografalo utilizzando un algoritmo crittografico con una chiave fissa o l'hash. Quindi lo verifichi solo all'interno del tuo programma. Un modo per distribuire il file di licenza (su Windows) è di fornirlo come un file che aggiorna il registro (salva l'utente che deve digitarlo).

Fai attenzione al falso senso di sicurezza: prima o poi qualcuno semplicemente correggerà il tuo programma per saltare quel controllo e distribuirà la versione patchata. Oppure, elaboreranno una chiave che supera tutti i controlli e lo distribuiscono, o retrodatano l'orologio, ecc. Non importa quanto contorto faccia il tuo schema, tutto ciò che fai per questo alla fine sarà sicurezza attraverso l'oscurità e lo faranno sempre essere in grado di questo. Anche se non possono farlo e distribuiranno la versione compromessa. Lo stesso vale anche se si fornisce un dongle: se qualcuno lo desidera, può correggere anche il controllo. La firma digitale del codice non aiuta, possono rimuovere quella firma o dimettersi.

Puoi complicare un po 'le cose usando tecniche per impedire l'esecuzione del programma in un debugger ecc., ma anche questo non è a prova di proiettile. Quindi dovresti solo rendere abbastanza difficile che un utente onesto non dimenticherà di pagare. Inoltre, fai molta attenzione che il tuo schema non diventi invadente per gli utenti paganti: è meglio avere alcune copie strappate rispetto ai tuoi clienti paganti per non essere in grado di utilizzare ciò per cui hanno pagato.

Un'altra opzione è quella di avere un controllo online: basta fornire all'utente un ID univoco e verificare online quali funzionalità deve avere tale ID e memorizzarlo nella cache per un certo periodo. Si applicano comunque le stesse avvertenze: le persone possono aggirare qualcosa del genere.

Considera anche i costi di supporto per dover trattare con utenti che hanno dimenticato la loro chiave, ecc.

modifica: voglio solo aggiungere, non investire troppo tempo in questo o pensare che in qualche modo il tuo schema contorto sarà diverso e non crackabile. Non lo farà e non può essere lungo quanto le persone controllano l'hardware e il sistema operativo su cui il programma è in esecuzione. Gli sviluppatori hanno cercato di escogitare schemi sempre più complessi per questo, pensando che se sviluppassero il proprio sistema per esso, questo sarebbe noto solo a loro e quindi 'più sicuro'. Ma è davvero l'equivalente di programmazione del tentativo di costruire una macchina a moto perpetuo. : -)

Altri suggerimenti

Di chi ti fidi?

Ho sempre considerato quest'area troppo critica per affidarmi a terzi per gestire la sicurezza di runtime della tua applicazione. Una volta che quel componente viene crackato per un'applicazione, viene crackato per tutte le applicazioni. È successo a Discreet in cinque minuti dopo aver scelto una soluzione di licenza di terze parti per 3ds Max anni fa ... Good times!

Scherzi a parte, prendi in considerazione l'idea di creare il tuo per avere il controllo completo sul tuo algoritmo. In tal caso, considera l'utilizzo dei componenti nella chiave seguendo le linee di:

  • Nome licenza: il nome del client (se presente) in licenza. Utile per la gestione delle implementazioni aziendali - farli sentire speciali per avere un "personalizzato" nome nelle informazioni sulla licenza fornite dall'utente.
  • Data di scadenza della licenza
  • Numero di utenti da eseguire con la stessa licenza. Ciò presuppone che tu abbia un modo per tracciare le istanze in esecuzione su un sito, in modo server
  • Codici funzione: per consentire di utilizzare lo stesso sistema di licenze su più funzioni e su più prodotti. Naturalmente se è rotto per un prodotto è rotto per tutti.

Quindi fai il check-out e aggiungi la crittografia (reversibile) che desideri per renderla più difficile da decifrare.

Per creare una chiave di licenza di prova, è sufficiente impostare i valori per i valori sopra che si traducono in "modalità di prova".

E poiché ora questo è probabilmente il codice più importante nella tua applicazione / azienda, oltre a / anziché all'offuscamento, considera di mettere le routine di decrittografia in un file DLL nativo e semplicemente P / Invoke .

Diverse aziende per cui ho lavorato hanno adottato approcci generalizzati per questo con grande successo. O forse non valeva la pena decifrare i prodotti;)

Se stai chiedendo delle chiavi che puoi digitare, come le chiavi dei prodotti Windows, sono basate su alcuni controlli. Se stai parlando delle chiavi che devi copiare incolla, allora si basano su una firma digitale (crittografia della chiave privata).

Una semplice logica del codice Product Key potrebbe essere quella di iniziare dicendo che il codice Product Key è costituito da quattro gruppi di 5 cifre, come abcde-fghij-kljmo-pqrst , e poi continua a specificare le relazioni interne come f + k + p dovrebbe essere uguale a a, il che significa che le prime cifre del gruppo 2, 3 e 4 dovrebbero totalizzare a. Ciò significa che 8xxxx-2xxxx-4xxxx-2xxxx è valido, così come lo è 8xxxx-1xxxx-0xxxx-7xxxx. Naturalmente, ci sarebbero anche altre relazioni, comprese relazioni complesse come, se la seconda cifra del primo gruppo è dispari, allora anche l'ultima cifra dell'ultimo gruppo dovrebbe essere dispari. In questo modo ci sarebbero generatori di codici Product Key e la verifica dei codici Product Key verificherebbe semplicemente se soddisfa tutte le regole.

La crittografia è normalmente la stringa di informazioni sulla licenza crittografata utilizzando una chiave privata (== con firma digitale) e convertita in Base64 . La chiave pubblica è distribuita con l'applicazione. Quando arriva la stringa Base64, viene verificata (== decrittografata) dalla chiave pubblica e se trovata valida, il prodotto viene attivato.

Che sia banale o difficile da decifrare, non sono sicuro che faccia davvero molta differenza.

La probabilità che la tua app venga violata è molto più proporzionale alla sua utilità piuttosto che alla forza della gestione delle chiavi del prodotto.

Personalmente, penso che ci siano due classi di utenti. Coloro che pagano. Quelli che non lo fanno. Quelli che lo faranno probabilmente lo faranno anche con la protezione più banale. Coloro che non lo faranno aspetteranno una crepa o guarderanno altrove. Ad ogni modo, non otterrai più denaro.

Devo ammettere che farei qualcosa di piuttosto folle.

  1. Trova un collo di bottiglia della CPU ed estrailo in un P / Invokeable file DLL.
  2. Come azione post build, crittografa parte del file DLL con un XOR chiave di crittografia.
  3. Seleziona uno schema di chiave pubblica / privata, includi la chiave pubblica nel file DLL
  4. Disporre in modo tale da decrittografare il codice Product Key e XORing i due dimezza insieme genera la chiave di crittografia per la DLL.
  5. Nel codice DllMain della DLL, disabilitare la protezione (PAGE_EXECUTE_READWRITE) e decodificalo con la chiave.
  6. Crea un metodo LicenseCheck () che esegua un controllo di integrità di chiave di licenza e parametri, quindi controlla l'intero file DLL, lanciando violazione della licenza su entrambi. Oh, e fai qualche altra inizializzazione qui.

Quando trovano e rimuovono LicenseCheck, che divertimento seguirà quando la DLL avvia errore di segmentazione .

Esiste anche l'opzione Licenze e protezione software Microsoft (SLP). Dopo averlo letto, vorrei davvero poterlo usare.

Mi piace molto l'idea di bloccare parti di codice basate sulla licenza. Cose interessanti e le più sicure per .NET. Lettura interessante anche se non la usi!

  

Microsoft & # 174; Licenze software e   I servizi di protezione (SLP) sono a   servizio di attivazione software che   abilita fornitori di software indipendenti   (ISV) per l'adozione di licenze flessibili   condizioni per i loro clienti. Microsoft   Servizi SLP utilizza un unico   metodo di protezione che aiuta a salvaguardare   la tua domanda e licenza   informazioni che ti consentono di arrivare a   mercato più veloce mentre in aumento   conformità del cliente.

Nota: questo è l'unico modo in cui rilascerei un prodotto con codice sensibile (come un prezioso algoritmo).

Se desideri una soluzione semplice solo per creare e verificare i numeri di serie, prova Ellipter . Utilizza la crittografia delle curve ellittiche e ha una "Data di scadenza" in modo da poter creare versioni di prova o chiavi di registrazione limitate nel tempo.

Un altro buon strumento economico per i codici Product Key e le attivazioni è un prodotto chiamato InstallKey. Dai un'occhiata a www.lomacons.com

Un metodo semplice consiste nell'utilizzare un Identificatore univoco globale (GUID). I GUID vengono generalmente memorizzati come valori a 128 bit e vengono comunemente visualizzati come 32 cifre esadecimali con gruppi separati da trattini, come {21EC2020-3AEA-4069-A2DD-08002B30309D} .

Usa il seguente codice in C # da System.Guid.NewGuid () .

getKey = System.Guid.NewGuid().ToString().Substring(0, 8).ToUpper(); //Will generate a random 8 digit hexadecimal string.

_key = Convert.ToString(Regex.Replace(getKey, ".{4}", "<*>/")); // And use this to separate every four digits with a "/".

Spero che sia d'aiuto.

Il trucco è avere un algoritmo che solo tu conosci (in modo che possa essere decodificato dall'altra parte).

Ci sono cose semplici come " Scegli un numero primo e aggiungi un numero magico "

Opzioni più complesse come l'uso della crittografia asimmetrica di un set di dati binari (che potrebbe includere un identificatore univoco, numeri di versione, ecc.) e distribuire i dati crittografati come chiave.

Potrebbe anche valere la pena leggere le risposte a anche questa domanda

Ci sono alcuni strumenti e API disponibili per questo. Tuttavia, non credo che ne troverai uno gratuitamente;)

Esiste ad esempio la suite OLicense: http://www.olicense.de/index.php?lang=en

Puoi controllare LicenseSpot . Fornisce:

  • Componente di licenza gratuita
  • Attivazione online
  • API per integrare la tua app e il tuo negozio online
  • Generazione di numeri di serie
  • Revoca licenze
  • Gestione delle iscrizioni

Sto andando un po 'sulle spalle alla grande risposta di @ frankodwyer e approfondirò un po' le licenze online. Sono il fondatore di Keygen , un'API REST di licenza creata per gli sviluppatori.

Dato che hai menzionato il desiderio di 2 "tipi" di licenze per la tua applicazione, ovvero una "versione completa" e una "versione di prova", possiamo semplificarla e utilizzare un modello di licenza delle funzionalità in cui si concedono in licenza funzionalità specifiche dell'applicazione (in questo caso, è presente un set di funzionalità "completo" e un "quot" ; prova " set di funzionalità).

Per iniziare, potremmo creare 2 tipi di licenza (chiamati criteri in Keygen) e ogni volta che un utente registra un account è possibile generare un " prova " licenza per iniziare (la "licenza di prova" implementa la nostra politica sulle funzionalità di "prova"), che puoi utilizzare per effettuare vari controlli all'interno dell'app, ad es. l'utente può utilizzare Trial-Feature-A e Trial-Feature-B .

E basandoci su questo, ogni volta che un utente acquista la tua app (sia che utilizzi PayPal, Stripe, ecc.), puoi generare una licenza implementando il "pieno" politica delle funzionalità e associarlo all'account dell'utente . Ora all'interno della tua app puoi verificare se l'utente ha un " pieno " licenza che può fare Pro-Feature-X e Pro-Feature-Y (facendo qualcosa come user.HasLicenseFor (FEATURE_POLICY_ID) ).

Ho citato di consentire ai tuoi utenti di creare account utente & # 8212; cosa intendo con questo? Ne ho parlato in dettaglio in a abbina altre risposte , ma una rapida spiegazione del motivo per cui penso che questo sia un modo superiore per autenticare e identificare i tuoi utenti:

  1. Gli account utente ti consentono di associare più licenze e più macchine a un singolo utente , dandoti un'idea del comportamento dei tuoi clienti e per richiedere loro gli "acquisti in-app" " ovvero l'acquisto del "pieno" versione (tipo di app mobili simili).
  2. Non dovremmo richiedere ai nostri clienti di inserire chiavi di licenza lunghe, che sono noiose da inserire e difficili da tenere traccia di , cioè si perdono facilmente. (Prova a cercare " chiave di licenza perduta " su Twitter!)
  3. I clienti sono abituati a usare una e-mail / password ; Penso che dovremmo fare ciò che le persone sono abituate a fare in modo da poter offrire una buona esperienza utente (UX).

Naturalmente, se non vuoi gestire gli account utente e vuoi i tuoi utenti inseriscano chiavi di licenza, va benissimo (e Keygen supporta anche questo ). Sto solo offrendo un altro modo per gestire questo aspetto delle licenze e, auspicabilmente, fornire una bella UX per i tuoi clienti.

Infine, poiché hai anche menzionato che desideri aggiornare queste licenze ogni anno, puoi impostare una durata sulle tue politiche in modo che " pieno " le licenze scadono dopo un anno e "prova" le licenze durano circa 2 settimane, richiedendo che i tuoi utenti acquistino una nuova licenza dopo la scadenza.

Potrei approfondire di più, entrare in associare macchine con utenti e cose del genere, ma ho pensato di provare a mantenere breve questa risposta e concentrarmi semplicemente sulle funzionalità di licenza per i tuoi utenti.

Controlla questa risposta: https://stackoverflow.com/a/38598174/1275924

L'idea è di usare Cryptolens come server delle licenze. Ecco un esempio passo-passo (in C # e VB.NET). Ho anche allegato uno snippet di codice per la verifica chiave di seguito (in C #):

var licenseKey = "GEBNC-WZZJD-VJIHG-GCMVD";
var RSAPubKey = "{enter the RSA Public key here}";

var auth = "{access token with permission to access the activate method}";
var result = Key.Activate(token: auth, parameters: new ActivateModel()
{
    Key = licenseKey,
    ProductId = 3349,
    Sign = true,
    MachineCode = Helpers.GetMachineCode()
});

if (result == null || result.Result == ResultType.Error ||
    !result.LicenseKey.HasValidSignature(RSAPubKey).IsValid())
{
    // an error occurred or the key is invalid or it cannot be activated
    // (eg. the limit of activated devices was achieved)
    Console.WriteLine("The license does not work.");
}
else
{
    // everything went fine if we are here!
    Console.WriteLine("The license is valid!");
}

Console.ReadLine();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top