Domanda

Ci sono stati alcuni messaggi tempestivi sulla sicurezza IP e simili, ma nessuno che posso trovare che affronti specificamente un algoritmo. In uno dei miei progetti attuali, abbiamo deciso di seguire la strada di un sistema di chiavi di registrazione offline.

Immagino che la maggior parte della nostra eventuale base di utenti sarà onesta, quindi non credo che abbiamo troppo di cui preoccuparsi. D'altra parte, preferirei che il cracker occasionale non avesse accesso senza una buona dose di sudore e lacrime.

Quindi, quali sono alcune opzioni per come generare (e verificare) la chiave? La codifica hardware è molto probabile perché il modello di installazione deve essere eseguito da una condivisione samba su un server Intranet. Inoltre, quanto deve essere lunga la chiave?

In secondo luogo, quanto è grande il pericolo che l'algoritmo di verifica venga semplicemente riflesso, anche se è offuscato? Sarebbe meglio invece scrivere l'algoritmo in codice non gestito?

È stato utile?

Soluzione

Secondo me, il problema chiave che dovrai affrontare non è con il tuo algoritmo di registrazione e il livello (o la mancanza) di offuscamento.

Piuttosto, è questo: ad un certo punto del tuo codice si riduce a una semplice decisione binaria: eseguire o uscire. L'hacking del sistema richiede solo di trovare e modificare questo punto di decisione.

Tutto il resto - offuscamento, firma forte, rilevazione di manomissioni - è orientato a renderlo più difficile, ma non può renderlo molto più difficile.

Altri suggerimenti

In genere ciò che vuoi fare è scegliere alcuni dati che vuoi includere nella chiave come chi li possiede e quando scade, forse anche alcuni piccoli pezzi di codice che l'applicazione deve funzionare correttamente (rendendo così difficile la creazione funziona senza la chiave). Quindi utilizza uno schema di firma digitale come RSA per firmare digitalmente la chiave con la chiave privata della tua azienda. Distribuire la chiave pubblica con l'eseguibile dell'applicazione. Quindi, quando carichi la chiave, verifica che la firma sia valida e quindi utilizza i dati contenuti nella chiave. Una chiave da 1024 o 2048 bit dovrebbe essere sufficiente per questo.

Ovviamente, non importa quanto sia sofisticato il tuo codice, qualcuno sarà sempre in grado di romperlo o aggirarlo. Quindi la domanda che ti devi porre è quanto vuoi renderlo difficile (tenendo presente che schemi più difficili sono più difficili da codificare e mantenere per te)? C'è un punto di rendimenti decrescenti, di solito piuttosto bassi. Fintanto che il programma non funzionerà senza una chiave e la chiave è abbastanza complicata da non poter essere falsa (o modificare la data di scadenza ecc.) Con un editor esadecimale, allora probabilmente stai bene.

Per quanto riguarda il refactoring della chiave, la sua scrittura in non gestito potrebbe non essere utile se uccidono il sito di chiamata da gestito a non gestito. Un'opzione che hai con l'offuscamento se stai usando Dotfuscator professional è abilitare il loro "Rilevazione manomissione" essenzialmente etichettano il tuo assembly e se qualcuno modifica puoi avere il tuo codice fare varie cose. Naturalmente l'hacker può rimuovere questo, ma è molto più sudore e lacrime.

Ho trovato solo un modo per bloccare il codice molto bene. Quasi ogni forma di validazione seriale può essere decifrata facilmente dal tuo programmatore medio del secondo anno.

Il modo in cui l'ho fatto è usare un oggetto License in .NET. All'interno del mio oggetto di licenza cresciuto in casa, legge una "licenza" file per scoprire dove " home " è. Tale licenza è una stringa crittografata. La chiave privata della stringa si trova nell'oggetto License.

L'oggetto License chiama quindi home con una password segreta, anch'essa crittografata. Il server decodifica la password e la convalida ... registrando anche l'IP e il nome utente in caso di indagine fraudolenta. Se il server è in grado di convalidare la password, risponde con una risposta segreta, nuovamente crittografata in modo che non possa essere falsificata. Se non può essere convalidato, la connessione viene interrotta. Non viene inviata alcuna risposta, pertanto l'oggetto Licenza dall'altra parte non riesce.

Quando l'oggetto License integrato fallisce, genererà automaticamente un'eccezione, costringendo l'applicazione a fallire e ad uscire nel momento in cui viene chiamata la licenza.

Mi ci sono voluti circa due giorni lavorativi per scrivere il server e l'oggetto License, quindi è un po 'un allenamento, ma non scienza missilistica.

Se vuoi qualche sorgente di esempio, o più informazioni, fammi sapere. Sarò felice di offrirti quello che posso.

Potresti dare un'occhiata alle risposte a questa domanda

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