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


90

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.

Relazionato:



@stukelly che è stato pubblicato dopo che J3r3myK ha pubblicato la sua domanda ...
Dozer789

Risposte:


83

Puoi fare qualcosa come creare un record che contiene i dati che desideri autenticare nell'applicazione. Ciò potrebbe includere tutto ciò che si desidera, ad esempio le funzionalità del programma da abilitare, la data di scadenza, il nome dell'utente (se si desidera collegarlo a un utente). Quindi crittografalo usando un algoritmo crittografico con una chiave fissa o hash. Quindi devi solo verificarlo all'interno del tuo programma. Un modo per distribuire il file di licenza (su Windows) è fornirlo come un file che aggiorna il registro (evita all'utente di doverlo digitare).

Attenzione però al falso senso di sicurezza: prima o poi qualcuno applicherà semplicemente una patch al tuo programma per saltare quel controllo e distribuirà la versione patchata. Oppure elaboreranno una chiave che supera tutti i controlli e la distribuirà, o retrodaterà l'orologio, ecc. essere in grado di farlo. Anche se non possono, qualcuno lo farà e distribuirà la versione compromessa. Lo stesso vale anche se fornisci un dongle: se qualcuno lo desidera, può correggere l'assegno anche per quello. La firma digitale del codice non aiuta, possono rimuovere quella firma o dimetterla.

Puoi complicare un po 'le cose usando tecniche per impedire che il programma funzioni in un debugger, ecc., Ma anche questo non è a prova di proiettile. Quindi dovresti solo rendere abbastanza difficile che un utente onesto non dimentichi di pagare. Inoltre, fai molta attenzione che il tuo schema non diventi invadente per gli utenti paganti: è meglio avere alcune copie strappate piuttosto che i tuoi clienti paganti 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 controllare online quali funzionalità dovrebbe avere quell'ID e memorizzarlo nella cache per un certo periodo. Tuttavia, si applicano gli stessi avvertimenti: le persone possono aggirare qualsiasi cosa del genere.

Considera anche i costi di supporto di 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 indistruttibile. Non lo farà e non potrà durare finché le persone controllano l'hardware e il sistema operativo su cui gira il tuo programma. Gli sviluppatori hanno cercato di elaborare schemi sempre più complessi per questo, pensando che se sviluppano il proprio sistema per questo, sarà noto solo a loro e quindi "più sicuro". Ma in realtà è l'equivalente di programmazione del tentativo di costruire una macchina a moto perpetuo. :-)


1
Buon riassunto. Se qualcuno non crede che sia semplice bypassare la ricerca di CheatEngine, è così facile che i non programmatori possano farlo. È meglio rendere questo livello semplice.
Kelly

Ho lo stesso problema, ho creato una chiave di licenza per la mia app con la data di scadenza e l'ultima data registrata per la verifica, ma il problema è che devo aggiungere la chiave privata per modificare il file per aggiornare l'ultima data registrata che è modo non intelligente per mettere la chiave nel codice. qualche consiglio?
Doicare

16

Di chi ti fidi?

Ho sempre considerato quest'area troppo critica per fidarmi di una terza parte per la gestione della sicurezza di runtime della tua applicazione. Una volta che quel componente è stato crackato per un'applicazione, è 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 ... Bei tempi!

Scherzi a parte, considera la possibilità di creare il tuo per avere il controllo completo sul tuo algoritmo. Se lo fai, considera l'utilizzo di componenti nella tua chiave sulla falsariga di:

  • Nome licenza: il nome del client (se presente) a cui stai concedendo la licenza. Utile per la gestione delle distribuzioni aziendali: falle sentire speciali per avere un nome "personalizzato" nelle informazioni sulla licenza che fornisci loro.
  • Data di scadenza della licenza
  • Numero di utenti da eseguire con la stessa licenza. Ciò presuppone che tu abbia un modo per tenere traccia delle istanze in esecuzione su un sito, in modo server
  • Codici funzionalità: per utilizzare lo stesso sistema di licenze su più funzionalità e su più prodotti. Ovviamente se è rotto per un prodotto, è rotto per tutti.

Quindi esegui il checksum e aggiungi la crittografia (reversibile) che desideri per renderlo più difficile da decifrare.

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

E poiché questo è probabilmente il codice più importante nella tua applicazione / azienda, oltre a / invece di offuscare considera di mettere le routine di decrittografia in un file DLL nativo e semplicemente P / Invoke ad esso.

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


3
La crittografia FYI è sempre reversibile, sarebbe inutile non poter leggere ciò che è stato crittografato. L'hashing è l'unico modo di "crittografia" a cui potresti pensare.
Samuel

"Non lanciare il tuo schema crittografico", che penso sia di Bruce Scheier (non sono sicuro), è la strada da percorrere. Potresti voler dare un'occhiata a questa risposta: security.stackexchange.com/questions/2202/…
Shadok

Puoi approfondire "..P / Invoke to it". Ho guardato la pagina collegata ma non mi ha reso più saggio: - /
MrCalvin

11

Se chiedi informazioni sui tasti che puoi digitare, come i codici Product Key di Windows, si basano su alcuni controlli. Se stai parlando delle chiavi che devi copiare e incollare, allora si basano su una firma digitale (crittografia della chiave privata).

Una semplice logica della chiave del prodotto potrebbe essere quella di iniziare dicendo che la chiave del prodotto è composta da quattro gruppi di 5 cifre, come abcde-fghij-kljmo-pqrst, e quindi continuare a specificare le relazioni interne come f + k + p dovrebbe essere uguale a, ovvero le prime cifre del 2 , 3 e 4 gruppi dovrebbero totalizzare a. Ciò significa che 8xxxx-2xxxx-4xxxx-2xxxx è valido, quindi 8xxxx-1xxxx-0xxxx-7xxxx. Naturalmente, ci sarebbero anche altre relazioni, comprese relazioni complesse come, se la seconda cifra del primo gruppo è dispari, anche l'ultima cifra dell'ultimo gruppo dovrebbe essere dispari. In questo modo ci sarebbero generatori per i codici Product Key e la verifica dei codici Product Key controllerebbe semplicemente se corrisponde a tutte le regole.

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


8

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 della chiave del prodotto.

Personalmente, penso che ci siano due classi di utenti. Quelli che pagano. Quelli che non lo fanno. Quelli che lo fanno probabilmente lo faranno anche con la protezione più banale. Quelli che non lo faranno aspetteranno una crepa o guarderanno altrove. Ad ogni modo, non ti farà guadagnare altri soldi.


6

Devo ammettere che farei qualcosa di piuttosto folle.

  1. Trova un collo di bottiglia della CPU ed estrailo in un file DLL P / Invokeable .
  2. Come azione successiva alla compilazione, crittografa parte del file DLL con una chiave di crittografia XOR.
  3. Seleziona uno schema di chiave pubblica / privata, includi la chiave pubblica nel file DLL
  4. Disporre in modo che la decrittografia del codice Product Key e l'XORing delle due metà insieme risultino nella chiave di crittografia per la DLL.
  5. Nel codice DllMain della DLL, disabilitare la protezione (PAGE_EXECUTE_READWRITE) e decrittografarlo con la chiave.
  6. Crea un metodo LicenseCheck () che esegue un controllo di integrità della chiave di licenza e dei parametri, quindi esegue il checksum dell'intero file DLL, generando una violazione della licenza su entrambi. Oh, e fai qualche altra inizializzazione qui.

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


Non sarebbe quindi necessario disabilitare DEP?
Rowland Shaw

No. L'impostazione PAGE_EXECUTE_READWRITE è il modo corretto documentato per scrivere codice auto-modificante e cancella il bit NX solo su quella pagina.
Joshua,

8
Questa tecnica generale era molto popolare alla fine degli anni '80. Il suo punto debole era che il codice "segreto" viene decrittografato nella RAM, rendendolo facile da rubare da qualsiasi copia in esecuzione del software.
Ray Burns

5

È disponibile anche l'opzione Servizi di licenza e protezione software Microsoft (SLP). Dopo averlo letto vorrei davvero poterlo usare.

Mi piace molto l'idea di bloccare parti di codice in base alla licenza. Roba calda e la più sicura per .NET. Lettura interessante anche se non la usi!

Microsoft® Software Licensing and Protection (SLP) Services è un servizio di attivazione del software che consente ai fornitori di software indipendenti (ISV) di adottare termini di licenza flessibili per i propri clienti. I servizi Microsoft SLP utilizzano un metodo di protezione unico che aiuta a salvaguardare le informazioni sulle applicazioni e sulle licenze, consentendoti di accedere più rapidamente al mercato aumentando la conformità dei clienti.

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


Per coloro che lo ricordano come cancellato: SLP viene rilanciato di nuovo
Michael Olesen

5

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


2

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


2

Un metodo semplice consiste nell'utilizzare un GUID ( Globally Unique Identifier ). I GUID vengono solitamente archiviati come valori a 128 bit e vengono comunemente visualizzati come 32 cifre esadecimali con gruppi separati da trattini, ad esempio {21EC2020-3AEA-4069-A2DD-08002B30309D}.

Usa il codice seguente in C # di 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}", "$0/")); // And use this to separate every four digits with a "/".

Spero possa essere d'aiuto.


1

Il trucco sta nell'avere un algoritmo che solo tu conosci (tale da poter essere decodificato dall'altra parte).

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

Opzioni più complesse come l'utilizzo 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 essere la pena di leggere le risposte a questa domanda , nonché


6
"Il trucco sta nell'avere un algoritmo che solo tu conosci": questa è più o meno la definizione di sicurezza per oscurità, e un'idea davvero pessima.
Nick Johnson,

3
Tutta la licenza è da un algoritmo che coinvolge segreti però. Il modo migliore per ottenere le licenze è spesso investire in avvocati, piuttosto che nella corsa agli armamenti di inventare chiavi "indistruttibili"
Rowland Shaw

+1 per il commento riguardante l'applicazione della licenza tramite mezzi legali
Rob

Sì, tutte le licenze sono deboli, proprio come DRM. Tuttavia, fare affidamento su un algoritmo segreto è più debole .
Nick Johnson

1
Ti ho dato +1 per una buona risposta, e vorrei darti anche un altro contro il voto negativo. Purtroppo ci sono dei bambini molto immaturi nel mondo.
ProfK


0

Puoi controllare LicenseSpot . Fornisce:

  • Componente di licenza gratuita
  • Attivazione in linea
  • API per integrare la tua app e il negozio online
  • Generazione del numero di serie
  • Revoca licenze
  • Gestione degli abbonamenti

1
"Free" non è realmente gratuito. È gratuito incorporare il componente di licenza nella tua app; non è gratuito per l'app utilizzare effettivamente il componente di licenza. Oltre le 10 attivazioni, è necessario pagare una quota mensile. Non è una percentuale per attivazione. Per le app .NET a basso costo a basso volume, questo modello di prezzo sarà uno svantaggio. Non è come l'AppStore di Apple per le app .NET.
Cheeso

0

Ho intenzione di ripassare un po 'l'ottima risposta di @ frankodwyer e scavare un po' più a fondo nelle licenze basate su Internet. Sono il fondatore di Keygen , un'API REST di licenze creata per gli sviluppatori.

Poiché hai menzionato la necessità di 2 "tipi" di licenze per la tua applicazione, ovvero una "versione completa" e una "versione di prova", possiamo semplificarlo e utilizzare un modello di licenza per funzionalità in cui concedi in licenza funzionalità specifiche della tua applicazione (in questo caso, c'è un set di funzionalità "completo" e un set di funzionalità "di prova").

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

E basandosi su questo, ogni volta che un utente acquista la tua app (sia che tu stia utilizzando PayPal, Stripe, ecc.), Puoi generare una licenza che implementa la politica della funzionalità "completa" e associarla all'account dell'utente . Ora all'interno della tua app puoi controllare se l'utente ha una licenza "completa" che può fare Pro-Feature-X e Pro-Feature-Y (facendo qualcosa di simile user.HasLicenseFor(FEATURE_POLICY_ID)).

Ho accennato a consentire ai tuoi utenti di creare account utente, cosa intendo con questo? Sono entrato in questo dettaglio in un paio di altre risposte , ma una rapida carrellata sul motivo per cui penso che questo sia un modo migliore 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 di richiedere loro "acquisti in-app", ovvero l'acquisto della tua versione "completa" (un po 'come le app mobili).
  2. Non dovremmo richiedere ai nostri clienti di inserire chiavi di licenza lunghe, che sono sia noiose da inserire che difficili da tenere traccia, ovvero si perdono facilmente. (Prova a cercare "codice di licenza perso" su Twitter!)
  3. I clienti sono abituati a utilizzare un'e-mail / password ; Penso che dovremmo fare ciò a cui le persone sono abituate in modo da poter fornire una buona esperienza utente (UX).

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

Infine, poiché hai anche affermato che desideri aggiornare queste licenze ogni anno, puoi impostare una durata sui criteri in modo che le licenze "complete" scadano dopo un anno e le licenze "di prova" durino 2 settimane, richiedendo che i tuoi utenti acquistino una nuova licenza dopo la scadenza.

Potrei scavare di più, associando macchine con utenti e cose del genere, ma ho pensato di provare a mantenere questa risposta breve e concentrarmi sulla semplice concessione di licenze per i tuoi utenti.


0

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

L'idea è di utilizzare Cryptolens come server delle licenze. Ecco un esempio dettagliato (in C # e VB.NET). Ho anche allegato uno snippet di codice per la verifica della 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();
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.