Attualmente sto lavorando a un'applicazione desktop in Java (utilizzando JavaFX).
Questa applicazione memorizza alcune informazioni dell'utente, parti delle quali sono sensibili. Ad esempio, se l'utente configura un proxy, lo memorizzerà in un file con crittografia. Inoltre, la mia applicazione sta chiamando un'API Web per eseguire gli aggiornamenti automatici (con uno schema di autenticazione di base).
Attualmente la mia applicazione è closed source e viene utilizzata in un contesto che non richiede un'elevata sicurezza. L'implementazione contiene fondamentalmente tutte le credenziali necessarie per l'autenticazione nell'API o per crittografare le impostazioni dell'utente. Fondamentalmente, contiene qualcosa di simile (semplificato, non è "così ovvio").
String login = "mysuperlogin", password = "mysuperpassword";
authenticateToApi(login, password);
String encryptionKey = "mysuperencryptionkey";
encryptDataToFile(data, file, encryptionKey);
Ma : so che questo modo di fare le cose non è affatto sicuro! So che è possibile "decompilare" Java e vedere le credenziali / i metodi usati dall'applicazione, e quindi usarli per accedere alle informazioni "sensibili".
Sto pianificando di aprire il mio progetto quest'anno, quindi so che devo fare le cose per fornire un livello di sicurezza migliore, ecco le opzioni che vedo:
- Uso delle proprietà compilate durante il tempo di compilazione per includere le mie credenziali direttamente nel codice, senza includerle nel codice sorgente: questo non risolve il problema "decompilare"
- Utilizzo di una chiave inserita dall'utente per garantire ogni informazione: non mi piace questa soluzione perché la mia applicazione deve essere utilizzata con l'intervento "tecnico" dell'utente più basso. Inoltre, questo non risolve i problemi delle credenziali API.
- Genera una chiave dal sistema corrente per crittografare i dati. Ma nella versione open-source, sarà possibile trovare la chiave di sistema corrente e quindi utilizzarla per accedere ai dati crittografati.
Suppongo che siano un sacco di programmi closed / open source che hanno questo problema, ma non riesco a capire quale sia la "meno peggio" soluzione.