Sto costruendo un'app e un server. Il server è un'API node.js con un backend Postgres.
Le immagini create nell'app verranno archiviate su Amazon S3. I metadati relativi ai file verranno archiviati in Postgres.
Ho eseguito lo zoom su due possibili soluzioni per le chiavi di crittografia. Entrambi coinvolgono gli URL di Amazon presenti. Questi URL sono generati da Amazon come risultato di una chiamata dal mio server.
- Foto scattata nell'app
- File di metadati salvati su Postgres tramite la mia API
- Il server riceve l'URL di Amazon da caricare per caricare i file
- L'URL viene restituito all'app in seguito alla chiamata nel passaggio 2.
- L'app utilizza l'URL per pubblicare il file su Amazon S3
Per quanto riguarda la crittografia dei file, potrei scegliere di utilizzare Amazon Key Management Service (kms), ovvero Amazon genera e tiene traccia delle chiavi di crittografia individualmente salate per ciascun file. Il mio server dovrebbe utilizzare la chiave master per ottenere gli URL presegnati generati.
Oppure potrei scegliere di generare chiavi di crittografia individuali per ogni file sul mio server e memorizzare queste chiavi con il resto dei metadati in Postgres. Amazon farebbe ancora la crittografia / decrittografia, ma passerei ogni singola chiave nella richiesta di URL preselezionati invece di passare la chiave master.
KMS, pro:
- Nessuna chiave di crittografia memorizzata con i metadati del file in Postgres
KMS, con:
- La chiave master sblocca tutti i file su S3 (ma la chiave master può essere ruotata)
Chiavi generate personalizzate, pro:
- È più facile implementare un tasto utente extra con XOR: l'inserimento delle chiavi. Se un client non si fida della mia gestione delle chiavi, potrebbe aggiungere una chiave extra che esiste solo sul dispositivo, probabilmente nella catena di chiavi di iOS.
Chiavi generate personalizzate. con:
- Se il database Postgres è compromesso, anche i file su S3 potrebbero essere compromessi.
Sono un programmatore, non un esperto di sicurezza. Se ho bisogno, consulterò un esperto, ma ho pensato che gli esperti di questo forum potrebbero essere in grado di dare qualche informazione in più in primo luogo.
Ovviamente sono state prese altre misure di sicurezza. L'app parla solo con l'API tramite HTTPS e l'app è autenticata con l'API (utilizzando Oath2 e JWT).
Mi piace molto il concetto di URL preselezionato, in quanto consente all'app di essere priva di chiavi necessarie per l'upload / download di S3.
Dovrei usare km o generare chiavi da solo?
Grazie!