Suggerirei la seguente implementazione.
Se il programma viene inizialmente avviato, creare un file crittografato e autenticato contenente un timestamp o un contatore per avere un valore iniziale.
È importante non utilizzare l'utente di base visualizzato e l'ora / ora modificabile, altrimenti il cliente potrebbe semplicemente impostare l'ora del sistema nel passato.
Quando esegui il programma, avvia un timer o incrementa il contatore per misurare l'utilizzo e aggiorna periodicamente il file autenticato crittografato.
Il luogo in cui è archiviato il file non è importante, ma per ottenere una sicurezza ragionevole è necessario utilizzare quanto segue:
-
Utilizza le funzioni di crittografia esistenti, che sono ben testate e forniscono sia la crittografia che l'autenticazione. Per dirla in modo semplice, la crittografia ti protegge da qualcuno che cerca di capire il contenuto, l'autenticazione dalla manipolazione
-
Genera una chiave casuale per la crittografia, senza hard coding. Tutto ciò che è hard coded può essere trovato attraverso il reverse engineering con più o meno sforzo. Anche riutilizzare le chiavi è sempre una cattiva idea
-
Memorizza la chiave in un posto dove non è possibile accedere automaticamente al tuo programma. Questa è la parte difficile, in quanto devi fidarti del sistema operativo per gestirlo correttamente, poiché le cose devono funzionare senza che tu inserisca manualmente le cose. Il mio suggerimento sarebbe utilizzare DPAPI (supponendo che si sviluppi per C # .NET su Windows).
Puoi facilmente memorizzare la tua chiave, e potrebbe anche cambiare la tua chiave di tanto in tanto senza grossi problemi.
Quindi, se l'utente cancella, scambia il file con una versione precedente o manipola il file, sei in grado di riconoscerlo.
Spero che questo dia alcune idee su come potresti farlo.
Modifica
Non ero corretto per quanto riguarda l'attacco di replay, se l'utente è in grado di accedere a entrambi i file, in effetti sarebbe in grado di sostituire entrambi con vecchie versioni.
Il mio suggerimento riguardante il tuo commento sarebbe il seguente :
Avere un file che contiene un timestamp, il contatore per l'utilizzo, il flag di spegnimento.
Avrai bisogno di un servizio Windows in esecuzione all'avvio. Imposta una voce di registro al primo avvio.
Il servizio verifica se il file è esistente e se è la prima volta che viene eseguito il servizio. Se c'è una voce di registro che viene eseguita per la prima volta, creare il file contenente il timestamp corrente (non dipendente dall'orologio di sistema, se possibile), il contatore per l'uso dovrebbe essere zero e il flag di arresto falso. Il file è crittografato e la chiave crittografata tramite DPAPI (utilizza un'entità aggiuntiva fissa). La voce di registro viene aggiornata come d'ora in poi, tutte le scritture consecutive saranno aggiornamenti.
Ora il servizio deve aggiornare il file in un intervallo fisso, ad es. ogni 10 minuti. Ciò significa non proteggere la chiave con DPAPI e decifrare il file. Qui è dove proteggiamo contro gli attacchi di replay. Il timestamp nel file è controllato e potrebbe non deviare più di ad es. 30 minuti (dovrebbe essere superiore all'intervallo di aggiornamento in caso di aggiornamento non riuscito). Se devia di più, si sospetta una manipolazione (o un grave errore dall'applicazione o dall'hardware o dal sistema operativo). Altrimenti, se tutto è a posto, il timestamp viene aggiornato all'ora corrente. Se il tuo servizio / programma è stato utilizzato nel frattempo, anche il contatore di utilizzo viene aggiornato. Genera una nuova chiave, cripta il file e memorizza la chiave dopo averla protetta con DPAPI.
Quando l'utente arresta il computer e lo avvia in un secondo momento, si avrebbe il problema, che il timestamp supera il limite consentito. Questo è il motivo per cui il file dovrebbe contenere il flag di spegnimento. Questo flag deve essere impostato quando l'utente arresta i computer. Quando il servizio viene interrotto, l'azione finale è aggiornare il file, con il flag di spegnimento impostato su true.
All'avvio il file viene letto e se il flag di spegnimento è true, impostalo su false e aggiorna nuovamente il timestamp.
Ecco come lo farei. Non è a prova di proiettile ma è più che sufficiente per proteggere dai clienti fraudolenti. Non andrei nemmeno così lontano e semplicemente utilizzo la combinazione DPAPI e file e memorizzerò l'output di DPAPI nel registro . Nessuna persona normale è la sua mente giusta passerebbe il suo tempo a cercare l'intero registro. Dopo tutto, sono i tuoi clienti non prigionieri. Con l'accesso fisico al computer non c'è modo di proteggerlo assolutamente.
Anche l'archivio isolato non è molto utile, ne ho appena letto la prima volta. L'utente e anche altri programmi con privilegi di amministratore / sistema saranno in grado di leggere questi file.