Supponiamo di avere un'app mobile in grado di salvare foto all'interno di file PDF crittografati AES-128 protetti da password. Per comodità, voglio che l'utente sia in grado di crittografare un file usando la password precedentemente utilizzata senza doverlo inserire di nuovo, ma voglio anche che i suoi dati siano sicuri se perdono il loro telefono o lo hanno rubato. Ovviamente, salvare la password in testo semplice nel file delle preferenze non è un'opzione.
In un PDF, la chiave di crittografia AES viene generata in questo modo:
key = hash(password + file_id + permission_flags)
Dove hash è una combinazione di RC4 e MD5 e il file_id è un numero casuale a 128 bit memorizzato nel testo in chiaro nel file. Ci sono alcuni avvertimenti in più: ogni oggetto nel file è crittografato con una chiave diversa derivata da quella principale, e ci sono anche password separate "utente" e "proprietario", ma ignoriamo tutto ciò per semplicità, e assumiamo anche il permesso_flags non cambia da file a file.
Crittografare la password per riutilizzarla in seguito non è sicura perché qualsiasi metodo che permetta all'app di decrittografare la password e utilizzarlo per generare la chiave di crittografia dato un file_id potrebbe essere utilizzato per generarlo per la decrittografia.
Idea: poiché i file_id sono solo numeri casuali, non dobbiamo aspettare che i file vengano creati prima di generarli, possiamo generare un batch di diverse migliaia file_ids e generare le chiavi associate data la password e l'archivio li come tuple in un file. Quindi, quando l'utente salva un file, possiamo leggere una chiave e un file_id, crittografare il file con la chiave, scrivere l'id_file sul file e quindi eliminare la tupla. Quindi, se un utente malintenzionato ottiene il dispositivo, avrà solo le chiavi per i file che non sono stati ancora salvati e nessun modo per generare le chiavi per i file che hanno. Una volta esaurito lo stash, l'utente deve semplicemente reinserire la password. Se l'utente cambia la password, il file viene eliminato e ne viene generato uno nuovo con la nuova password.
Sembra che potrebbe funzionare, ma non ho mai sentito parlare di questa tecnica prima quindi sono riluttante a usarlo come "rolling your own crypto". Sembra anche che potrebbe esserci un problema se l'utente esegue il backup del proprio dispositivo, perché in quel caso ci saranno copie extra che galleggiano su tutte le chiavi.
Qual è la soluzione migliore per questo problema di riutilizzo della chiave, supponendo che non sia crittografata a livello di sistema a livello di sistema?