Sto lavorando a un software che deve archiviare e utilizzare i segreti.
Questi segreti possono essere ad esempio:
- una password per connettersi a un database
- un segreto client per una sovvenzione di OAuth 2.0
client_credentials
.
Ho bisogno di memorizzare queste password da qualche parte (preferibilmente in qualche tipo di file di configurazione) e proteggerle con ragionevole sicurezza.
Sicurezza ragionevole significa: nessuna soluzione hardware pesante come HSM o un'infrastruttura complicata (PKI, ...).
Il software è in Java, dovrebbe essere eseguito ovunque Java possa essere eseguito (Soprattutto Windows, GNU / Linux, Solaris, AIX).
Non può fare affidamento su un sistema operativo o su uno strumento specifico di distribuzione come il keystore di GNOME, KDE Wallet o uno di questi, a meno che Java non sia in grado di gestirli (ma ne dubito).
Ho pensato di utilizzare la crittografia simmetrica per crittografare i segreti durante la configurazione del software e decrittografarli in fase di runtime quando necessario. Ma non so come gestire la chiave di crittografia.
Ho trovato 4 possibili soluzioni:
- Usa PBKDF2 (SHA256-AES256-CBC) o semplice AES256-CBC con una chiave crittografica hardcoded e opzionalmente qualche offuscamento del codice (con ProGuard )
- Di questo c'è un CWE dedicato: CWE-321 - Uso della chiave crittografica hard-coded . Quindi dubito che questa sia la soluzione.
- Usa PBKDF2 (SHA256-AES256-CBC) o semplice AES256-CBC con una chiave in un file sul filesystem
- Espone la chiave in un file che dovrebbe essere protetto in qualche modo
- filesystem crittografato e / o
- ACL forzato
- qualcos'altro?
- Espone la chiave in un file che dovrebbe essere protetto in qualche modo
- Utilizza il keystore Java
- Il keystore Java richiede una password da sbloccare, quindi dove memorizzare la password del keystore Java? Come proteggerlo? Il serpente si sta mangiando la coda ...
- In qualche modo equivalente a 2
- Utilizza la crittografia white-box
- Ha mostrato alcuni punti deboli ed è più o meno equivalente all'offuscamento. (che si trova all'interno dell'opzione 1).
- Non sono sicuro che l'implementazione Java di WBC sia matura.
Ho visto questa domanda: Pratiche per la memorizzazione del nome utente / password nelle applicazioni Web .
Quindi la mia domanda qui è: Qual è l'opzione "migliore" risonabile per proteggere i miei dati segreti?
Ritengo che 2 sia migliore, dopotutto è semplice, e la protezione della chiave segreta si baserebbe sul sistema operativo piuttosto che sul software stesso, proprio come OpenSSH, ma non ne sono totalmente convinto.
Modifica
PBKDF2 potrebbe essere sostituito da qualsiasi altro algoritmo di derivazione della chiave di base della password, come l'algoritmo di derivazione chiave PKCS # 12 v1.
Bonus:
Se dovessi scegliere tra PBKDF2 (SHA256-AES256-CBC) o semplice AES256-CBC , quale sarebbe il migliore?
- Si dice che PBKDF2 sia buono per proteggere le password perché è 'lento'. Ed è stato progettato per questo.
- AES256-CBC è più semplice (non c'è bisogno di salare / hash / iterare la chiave come in PBKDF2)