Sto scrivendo un'applicazione desktop .NET che viene utilizzata per inviare ordini a un server tramite un'API REST. Per evitare la perdita del nostro token di autenticazione, ho fatto in modo che, una volta usato per la prima volta, l'utente debba inviare il token di autenticazione e una password per crittografarlo con.
L'algoritmo di crittografia è AES-256-CBC e lo schema è il seguente: la password viene cancellata prima che venga utilizzata dall'algoritmo, il sale utilizzato per l'hashing è il GUID del computer, quindi copiare i file del programma non è sufficiente e la IV viene generata casualmente e concatenata con il codice. Quando l'utente apre il programma in seguito, gli viene richiesta una password, viene avviata la decrittografia e quando il token di autenticazione non corrisponde alla maschera richiesta restituirà un errore. Fin qui tutto bene direi.
Tuttavia , il mio supervisore non è ancora soddisfatto del livello di sicurezza: vuole che il programma registri tutti gli ordini che sono stati inviati al server in caso di anomalie amministrative da parte della terza parte che ospita il server, solo per avere un riferimento con un ragionevole livello di credibilità (anche se suppongo che potresti chiamarlo 'prova' nel caso che la loro amministrazione fallisca). La parte "credibilità" è quella in cui qualsiasi implementazione diretta di un file di log viene visualizzata direttamente dalla finestra, non fornirebbe:
- Integrità: nessuna persona (incluso l'utente) può modificare il file di log con contenuti che non riflettono l'effettivo utilizzo del programma. Il registro può essere aggiunto solo quando viene utilizzata la funzione principale del programma e solo dal programma stesso.
- Riservatezza: il contenuto del registro può essere richiamato solo dall'utente del programma (la richiesta della password aiuterà l'identificazione dell'utente).
Ho provato a creare uno schema crittografico (firma digitale) che codifica ogni record che viene aggiunto al registro e crittografa la chiave pubblica con la password dell'utente, ma questo non risolve metà problema: la chiave privata dovrebbe essere comunque memorizzato dal programma, quindi in senso stretto significa che l'utente ha accesso ad esso e ha la possibilità di modificare il registro.
Esiste un metodo o uno schema che soddisfa questi requisiti?