Domanda

Attualmente sono coinvolto nello sviluppo di un prodotto (sviluppato in C#) che sarà disponibile per il download e l'installazione gratuitamente ma in una versione molto limitata.Per avere accesso a tutte le funzionalità l'utente deve pagare un canone di licenza e ricevere una chiave.Tale chiave verrà quindi inserita nell'applicazione per "sbloccare" la versione completa.

Dato che usare una chiave di licenza del genere è abbastanza normale, mi chiedo:

  1. Come si risolve di solito?
  2. Come posso generare la chiave e come può essere convalidata dall'applicazione?
  3. Come posso anche evitare che una chiave venga pubblicata su Internet e utilizzata da altri che non hanno pagato la licenza (una chiave che sostanzialmente non è "loro").

Immagino che dovrei anche collegare la chiave alla versione dell'applicazione in qualche modo in modo che sia possibile addebitare nuove chiavi nelle versioni delle funzionalità.

C'è qualcos'altro a cui dovrei pensare in questo scenario?

È stato utile?

Soluzione

Avvertimento:non è possibile impedire agli utenti di piratare, ma solo rendere più semplice per gli utenti onesti fare la cosa giusta.

Supponendo che non desideri eseguire una build speciale per ciascun utente, quindi:

  • Genera te stesso una chiave segreta per il prodotto
  • Prendi il nome dell'utente
  • Concatena il nome dell'utente, la chiave segreta e l'hash con (ad esempio) SHA1
  • Decomprimere l'hash SHA1 come stringa alfanumerica.Questa è la "chiave prodotto" del singolo utente
  • All'interno del programma, esegui lo stesso hash e confrontalo con il codice Product Key.Se uguale, ok.

Ma, ripeto: questo non impedirà la pirateria


Recentemente ho letto che questo approccio non è crittograficamente molto valido.Ma questa soluzione è già debole (poiché il software stesso deve includere la chiave segreta da qualche parte), quindi non credo che questa scoperta infici la soluzione fino in fondo.

Ho solo pensato che avrei dovuto menzionarlo, però;se hai intenzione di ricavare qualcos'altro da questo, fai attenzione.

Altri suggerimenti

Ci sono molti modi per generare chiavi di licenza, ma pochi di questi modi sono davvero sicuro. Ed è un peccato, perché per le aziende, le chiavi di licenza hanno quasi lo stesso valore di denaro reale.

Idealmente, si vorrebbe le chiavi di licenza di avere le seguenti caratteristiche:

  1. Solo la vostra azienda deve essere in grado di generare le chiavi di licenza per i vostri prodotti, anche se qualcuno ingegneri invertire completamente i vostri prodotti (che avverrà, parlo per esperienza). Offuscando l'algoritmo o nascondere una chiave di crittografia all'interno del vostro software è davvero fuori questione, se si è sul serio il controllo delle licenze. Se il prodotto è successo, qualcuno farà un generatore di chiavi nel giro di pochi giorni dal rilascio.

  2. Una chiave di licenza dovrebbe essere utilizzabile su un solo computer (o almeno si dovrebbe essere in grado di controllare questo molto strettamente)

  3. Una chiave di licenza deve essere breve e facile da digitare o dettare al telefono. Se non si desidera tutti i clienti di chiamare il supporto tecnico, perché non capiscono se la chiave contiene una "l" o un "1". Il vostro servizio di assistenza si sarebbe ringrazio per questo, e si avrà una riduzione dei costi in questo settore.

Quindi, come si fa a risolvere queste sfide?

  1. La risposta è semplice, ma tecnicamente impegnativo: le firme digitali che utilizzano la crittografia a chiave pubblica. Le chiavi di licenza dovrebbero essere infatti firmato "documenti", che contiene alcuni dati utili, firmato con la chiave privata della vostra azienda. Le firme devono essere parte della chiave di licenza. Il prodotto deve validare le chiavi di licenza con la corrispondente chiave pubblica. In questo modo, anche se qualcuno ha pieno accesso alla logica del vostro prodotto, non possono generare le chiavi di licenza, perché non hanno la chiave privata. Una chiave di licenza sarebbe simile a questa: Base32 (CONCAT (DATA, PRIVATE_KEY_ENCRYPTED (cancelletto (DATA)))) La più grande sfida qui è che gli algoritmi a chiave pubblica classici hanno grandi formati di firma. RSA512 ha una firma a 1024 bit. Tu non vuoi le chiavi di licenza di avere centinaia di personaggi. Uno dei più potenti approcci è quello di utilizzare crittografia a curva ellittica (con attente implementazioni per evitare i brevetti esistenti). chiavi ECC sono come 6 volte più breve di chiavi RSA per la stessa forza. È possibile ridurre ulteriormente le dimensioni di firma utilizzando algoritmi come l'algoritmo di firma digitale Schnorr (brevetto è scaduto nel 2008 - buona :))

  2. Questo è ottenibile con l'attivazione del prodotto (Windows è un buon esempio). In sostanza, per un cliente con una chiave di licenza valida, è necessario generare un po 'di "dati di attivazione", che è un messaggio firmato embedding id hardware del computer come i dati firmati. Questo di solito è fatto su internet, ma solo una volta: il prodotto invia il codice di licenza e l'ID hardware del computer a un server di attivazione, e il server di attivazione rinvia il messaggio firmato (che può anche essere fatto breve e facile da dettare il Telefono). Da quel momento in poi, il prodotto non controlla il codice di licenza in fase di avvio, ma i dati di attivazione, che ha bisogno il computer per essere lo stesso al fine di convalidare (in caso contrario, i dati sarebbe stato diverso e la firma digitale non convalida). Si noti che il controllo dei dati di attivazione non richiedono la verifica su Internet:. È sufficiente verificare la firma digitale dei dati di attivazione con la chiave pubblica già incorporato nel prodotto

  3. Beh, basta eliminare i caratteri ridondanti come "1", "l", "0", "o" dalle chiavi. Dividere la stringa chiave di licenza in gruppi di caratteri.

Risposta semplice: non importa quale schema utilizzi, può essere violato.

Non punire i clienti onesti con un sistema pensato per prevenire gli hacker, poiché gli hacker riusciranno comunque a violarlo.

Un semplice codice hash legato alla loro email o simile è probabilmente sufficiente.Gli ID basati sull'hardware diventano sempre un problema quando le persone devono reinstallare o aggiornare l'hardware.

Buon thread sull'argomento:http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34

Quando si genera la chiave, non dimenticare per concatenare la versione e numero di build per la stringa si calcola l'hash su. In questo modo non ci sarà una sola chiave che apre tutto tutto quello che mai rilasciato.

Dopo aver trovato alcune chiavi o patch galleggianti in astalavista.box.sk saprete che siete riusciti a fare qualcosa di abbastanza popolare che qualcuno dava fastidio a incrinarsi. Rallegratevi!

Oltre a quanto già detto ....

Qualsiasi utilizzo di applicazioni .NET sono intrinsecamente fragile a causa dei problemi di lingua intermedi. Una semplice smontaggio del codice di .NET si aprirà il prodotto a chiunque. Si può facilmente aggirare il codice di licenza in quel punto.

Non è possibile anche utilizzare valori hardware per creare più di una chiave. Le macchine virtuali ora permettono a qualcuno di creare un'immagine di una macchina 'licenza' ed eseguirlo su qualsiasi piattaforma che hanno scelto.

Se è software costosi ci sono altre soluzioni. Se non lo è, basta rendere difficile sufficiente per l'hacker casuale. E accettare il fatto che non ci saranno copie prive di licenza là fuori alla fine.

Se il prodotto è complicato, i problemi di supporto inerenti saranno a creare una certa protezione per te.

Il motore # / .NET C che usiamo per la generazione di chiavi di licenza è ora mantenuta come open source:

https://github.com/appsoftware/.NET-Licence-Key- Generatore .

Si basa su un sistema di "parziale Controllo delle chiavi", che significa solo un sottoinsieme della chiave che si utilizza per generare la chiave deve essere compilato nel vostro distribuibile. È possibile creare le chiavi la vostra auto, quindi l'implementazione di licenza è unico al vostro software.

Come detto in precedenza, se il codice può essere decompilato, è relativamente facile da aggirare la maggior parte dei sistemi di autorizzazione.

Ho usato Crypkey in passato. E 'uno dei tanti disponibili.

È possibile proteggere solo il software fino a un certo punto con qualsiasi sistema di licenze.

Non so quanto elaborato si desidera ottenere

ma credo che .NET possono accedere al numero di serie del disco rigido.

si potrebbe avere il programma di inviare questo e qualcosa di Eles (come il nome utente e l'indirizzo MAC della scheda di rete)

si calcola un codice in base al largo che ed e-mail di nuovo la chiave.

li manterranno dal passaggio macchine dopo che hanno la chiave.

Sono uno degli sviluppatori dietro a Criptolente piattaforma di licenza software e lavoro su sistemi di licenza dall'età di 14 anni.In questa risposta ho inserito alcuni consigli basati sull’esperienza acquisita negli anni.

Il modo migliore per risolvere questo problema è configurare un server delle chiavi di licenza che ciascuna istanza dell'applicazione chiamerà per verificare una chiave di licenza.

Vantaggi di un server di chiavi di licenza

I vantaggi di un server delle chiavi di licenza sono i seguenti:

  1. puoi sempre aggiornare o bloccare una chiave di licenza con effetto immediato.
  2. ciascuna chiave di licenza può essere bloccata su un determinato numero di macchine (questo aiuta a impedire agli utenti di pubblicare la chiave di licenza online affinché altri possano utilizzarla).

Considerazioni

Sebbene la verifica delle licenze online offra un maggiore controllo su ogni istanza dell'applicazione, la connessione Internet non è sempre presente (soprattutto se ti rivolgi alle aziende più grandi), quindi abbiamo bisogno di un altro modo per eseguire la verifica della chiave di licenza.

La soluzione è firmare sempre la risposta della chiave di licenza dal server utilizzando un sistema crittografico a chiave pubblica come RSA o ECC (possibilmente meglio se si prevede di eseguirlo su sistemi embedded).La tua applicazione dovrebbe avere solo il file chiave pubblica per verificare la risposta della chiave di licenza.

Pertanto, nel caso in cui non sia disponibile una connessione Internet, è possibile utilizzare invece la risposta della chiave di licenza precedente.Assicurati di conservare entrambi i file data e il identificatore della macchina nella risposta e controlla che non sia troppo vecchio (es.consenti agli utenti di rimanere offline per un massimo di 30 giorni, ecc.) e che la risposta della chiave di licenza appartenga al dispositivo corretto.

Nota dovresti sempre controllare il certificato di risposta della chiave di licenza, anche se sei connesso a Internet), per assicurarti che non sia stato modificato da quando ha lasciato il server (questo deve essere fatto anche se la tua API alla licenza il server delle chiavi utilizza https)

Protezione degli algoritmi segreti

La maggior parte delle applicazioni .NET possono essere decodificate abbastanza facilmente (esiste sia un diassemblatore fornito da Microsoft per ottenere il codice IL sia alcuni prodotti commerciali possono persino recuperare il codice sorgente ad es.C#).Naturalmente puoi sempre offuscare il codice, ma non è mai sicuro al 100%.

Nella maggior parte dei casi, lo scopo di qualsiasi soluzione di licenza software è aiutare le persone oneste a essere oneste (ad es.che gli utenti onesti e disposti a pagare non si dimentichino di pagare dopo la scadenza del periodo di prova, ecc.).

Tuttavia, potresti avere ancora del codice che non vuoi assolutamente rendere pubblico (ad es.un algoritmo per prevedere i prezzi delle azioni, ecc.).In questo caso, l'unica strada da percorrere è creare un file Endpoint API che l'applicazione chiamerà ogni volta che il metodo deve essere eseguito.Richiede una connessione Internet ma garantisce che il tuo codice segreto non venga mai eseguito dal computer client.

Implementazione

Se non vuoi implementare tutto da solo, ti consiglio di dare un'occhiata questo tutorial (parte di Criptolente)

L'unico modo per fare tutto ciò che avete chiesto è quello di richiedere un accesso a internet e la verifica con un server. L'applicazione ha bisogno di accedere al server con la chiave, e quindi è necessario per memorizzare i dettagli della sessione, come l'indirizzo IP. Ciò impedirà la chiave venga utilizzato su macchine diverse. Questo di solito non è molto popolare tra gli utenti dell'applicazione, ed a meno che non si tratta di un'applicazione molto costoso e complicato che non vale la pena.

Si potrebbe semplicemente avere una chiave di licenza per l'applicazione, e quindi controllare lato client se la chiave è buona, ma è facile da distribuire questa chiave ad altri utenti, e con un decompilatore nuove chiavi possono essere generati.

Ho implementato di attivazione una tantum Internet in base alla mia società di software (C # .NET) che richiede un codice di licenza che si riferisce a una licenza memorizzata nel database del server. Il software colpisce il server con la chiave ed è dato informazioni di licenza che viene poi crittografato a livello locale utilizzando una chiave RSA generata da alcune variabili (una combinazione di CPUID e altre cose che non cambierà spesso) sul computer client e quindi lo memorizza in il registro di sistema.

Si richiede un po 'di codifica sul lato server, ma ha funzionato molto bene per noi e sono stato in grado di utilizzare lo stesso sistema quando abbiamo ampliato al software basato su browser. Dà anche persone le vendite grande informazioni su chi, dove e quando il software è in uso. Qualsiasi sistema di licenze che viene gestito solo localmente è completamente vulnerabili allo sfruttamento, soprattutto con la riflessione in .NET . Ma, come è già stato detto, nessun sistema è totalmente sicuro.

A mio parere, se non si utilizza delle licenze basato sul web, non c'è vero e proprio punto di proteggere il software a tutti. Con il mal di testa che il DRM può causare, non è giusto per gli utenti che hanno effettivamente pagati per farlo soffrire.

Sono fermamente convinto, che il sistema solo crittografia a chiave pubblica basato licenza è l'approccio giusto qui, perché non si dispone di includere le informazioni essenziali necessarie per la generazione di licenza nel vostro codice sorgente.

In passato, ho usato Biblioteca licenze di treek più volte, a causa è capace di soddisfare qualunque queste esigenze e offre davvero un buon prezzo. Esso utilizza la stessa protezione di licenza per gli utenti finali e per sé e nessuno incrinato che fino ad ora. È inoltre possibile trovare buoni consigli sul sito web per evitare la pirateria e screpolature.

Come pochi altri menzionati, io sono un grande avversario di essere ostile ai clienti di default, qualcosa che l'industria delle licenze è noto per. Quindi mi spieghi una buona soluzione per il vostro problema che offre anche un buon cliente UX .

Per cominciare, lei ha detto che si dispone di una versione "limitata" del software che si sta utilizzando per cercare di convertire i clienti di "upgrade" per le funzionalità aggiuntive. Quindi quello che stai cercando sono caratteristica licenze per il prodotto per esempio un cliente può acquistare una licenza per caratteristica-X o caratteristica-Y .

Keygen con questo tipo di licenza in mente. Keygen è un'API REST di licenza che consente di gestire gli account utente, licenze e monitorare anche macchine di utilizzo / associazioni.

Quello che vorrei fare è impostare 2 tipi di licenza ( politica all'interno Keygen) in cui uno è una politica di base per la versione gratuita limitata, e l'altro è un la politica per la versione a pagamento.

Non sono sicuro di quello che si sta utilizzando per i pagamenti, ma supponiamo che stai usando qualcosa come Stripe (abbastanza standard al giorno d'oggi), che offre webhooks . Keygen ha anche webhooks (se usare o no, tutto questo è ancora applicabile). È possibile integrare Keygen per parlare con il vostro fornitore di pagamento tramite webhooks da entrambi i lati. (Pensate: customer.created-> creare licenza base per il cliente, license.created-> cliente carica per la nuova licenza)

Quindi, utilizzando webhooks, siamo in grado di automatizzare la creazione di licenza per i nuovi clienti. E per quanto riguarda la convalida della licenza all'interno dell'applicazione stessa? Questo può essere fatto in una varietà di modi, ma il modo più popolare è richiedendo al cliente di inserire una chiave di licenza a lungo in un campo di input che è quindi possibile convalidare; Credo che questo sia un terribile modo per gestire la convalida della licenza nell'applicazione.

Perché penso che? Ben prima di tutto, si sta richiedendo al cliente di inserire una chiave di licenza noiosamente lungo che è destinato per il consumo della macchina, e la seconda il tuo voi e il vostro cliente che richiede di tenere traccia di detta chiave noiosamente lungo di licenza .

Va bene, quindi qual è un'alternativa? Credo che la migliore alternativa sta facendo qualcosa tutti i vostri clienti sono abituati a: permettendo loro di creare un account per il prodotto utilizzando una e-mail / password . È quindi possibile associare tutte le loro licenze e le loro macchine con tale account. Così ora invece di immettere una chiave di licenza, possono semplicemente accedere utilizzando le proprie credenziali.

Quali sono i vantaggi che ti danno? In primo luogo, si libera della necessità per voi e per i vostri clienti a tenere traccia delle chiavi di licenza, dal momento che è tutto gestito dietro le quinte all'interno del proprio account utente e cosa più importante: si può ora offrire ai vostri clienti self-service attivazione della licenza e la macchina vale a dire dal momento che tutte le loro licenze e le macchine sono associati con il proprio account utente, si può! spingerli ad acquistare una licenza quando sparano la vostra applicazione su una macchina non riconosciuto.

Ora sulla convalida della licenza : ogni volta che il cliente accede nella vostra applicazione con loro email / password, è possibile interrogare il loro account utente per le licenze di loro proprietà per determinare se possono usare Feature- X o caratteristica-Y . E dal momento che l'applicazione è ora self-service , è possibile consentire ai clienti di acquistare funzioni aggiuntive direttamente dall'interno dell'applicazione!

Quindi, abbiamo introdotto una ton di automazione per il nostro sistema di licenze, siamo in grado di licenza individuale caratteristiche (cioè una limitata vs versione completa), abbiamo offerto un impressionante UX per i nostri clienti e abbiamo anche alleviato uno dei principali motivi per le richieste di assistenza:. licenza recupero della chiave

In ogni modo, questo ha a lungo, ma si spera che aiuta qualcuno!

Non è possibile prevenire completamente la pirateria del software. È possibile prevenire la pirateria casuale e questo è ciò che tutte le soluzioni di licenza il loro do.

Nodo (macchina) di licenza bloccata è meglio se si vuole evitare il riutilizzo delle chiavi di licenza. Sono stato con Cryptlex per circa un anno per il mio software. Ha un piano gratuito anche, quindi se non vi aspettate troppo molti clienti si può utilizzare gratuitamente.

È possibile utilizzare una soluzione gratuita di terze parti per gestire questo per voi come Quantum-Key.Net È gratuito e gestisce i pagamenti via PayPal attraverso una pagina di vendita web che crea per voi, emissione chiave tramite e-mail e blocca l'uso chiave per una computer specifico per prevenire la pirateria.

Il tuo dovrebbe anche prendersi cura di offuscare / criptare il codice o può essere facilmente reverse engineering utilizzando software come De4dot e .NetReflector. Un buon codice obfuscator libero è ConfuserEx wich è veloce e semplice da usare e più efficace rispetto alle alternative costose.

Si dovrebbe eseguire il software finito attraverso De4Dot e .NetReflector di decodificare e vedere cosa un cracker avrebbe visto se hanno fatto la stessa cosa e per essere sicuri di non aver lasciato alcun codice importante esposizione o mascherato.

Il software sarà ancora violabile ma per il cracker casuale può ben essere sufficiente a metterli fuori e questi semplici passi sarà anche evitare che il codice in fase di estratti e riutilizzati.

https://quantum-key.net

Come usare ConfuserEx?

https://github.com/0xd4d/de4dot

https://www.red-gate.com / dinamico / prodotti / dotnet-sviluppo / riflettore / scaricare

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top