Sto implementando un'API di tipo Dropbox e uno dei miei requisiti è quello di avere i file memorizzati crittografati sul server. È non richiesto che i file siano resi illeggibili dal server, solo che non sono archiviati in chiaro su disco. Sto usando Python con Flask per la parte API e PyCrypto per la crittografia.
Non conosco assolutamente nulla di crypto e non voglio fare nulla (troppo) stupido. Questo è ciò che ho implementato, per favore dimmi come suona [un] ragionevole:
- Quando l'utente immette un file, il contenuto viene crittografato mentre viene letto dalla rete utilizzando AES-256 MODE_CTR (Volevo evitare la restrizione della dimensione del blocco di MODE_ECB e MODE_CBC)
- La chiave di crittografia è la password con hash dell'utente: evita di utilizzare una singola "chiave server" per ogni file memorizzato e rende i file illeggibili se l'utente cambia la password
- La generazione di contatori utilizza Crypto.Util.Counter con un parametro casuale
initial_value
specifico per ogni file e memorizzato nel database (proprio come una password salt) - Sto prendendo in considerazione l'estensione dell'API per consentire all'utente di fornire la propria chiave di crittografia insieme alla richiesta PUT. Dovrebbe quindi fornire la stessa chiave nel suo GET per recuperare il contenuto decifrato.
Ovviamente, la comunicazione con l'API avviene su HTTPS.