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:
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:
Risposte:
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. :-)
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:
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;)
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.
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.
Devo ammettere che farei qualcosa di piuttosto folle.
Quando trovano e rimuovono LicenseCheck, che divertimento seguirà quando la DLL inizierà la segmentazione in errore .
È 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).
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 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.
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é
Ci sono alcuni strumenti e API disponibili per questo. Tuttavia, non credo che ne troverai uno gratis;)
C'è ad esempio la suite OLicense: http://www.olicense.de/index.php?lang=en
Puoi controllare LicenseSpot . Fornisce:
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:
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.
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();