Ho scritto un software che codifica simmetricamente file di grandi dimensioni (multi-megabyte). Il testo normale è crittografato, dopo la crittografia l'HMAC viene calcolato e scritto nell'intestazione del file. Durante la crittografia, aggiorno HMAC continuamente, utilizzando come blocchi di dati crittografati (crittografia e MAC). Non ci sono checksum su ogni blocco, quindi l'unica possibilità di verificare se il file crittografato è stato compromesso è leggere l'intero file crittografato, calcolare l'HMAC dell'intero file e confrontarlo con il valore memorizzato nell'intestazione del file crittografato.
La mia domanda: sulla decrittografia, è meglio autenticare prima i dati crittografati e poi tentare di decrittografarli, o procedere con la decrittazione e alla fine confrontare HMAC dall'intestazione del file con l'HMAC effettivo della crittografia dati?
Ecco le mie considerazioni:
1. Il calcolo dell'HMAC prima del tentativo di decrittografia mi sembra, a prima vista, più "sicuro". D'altra parte, devo prima leggere l'intero file, calcolare e confrontare HMAC e quindi leggere l'intero file ANCORA UNA VOLTA - questa volta per decodificare il testo in chiaro. Questo diminuisce le prestazioni, specialmente se il file di input è grande, ma non memorizziamo testo cifrato decifrato su disco (o altrove), quindi se il testo in chiaro è compromesso, l'utente generale non può accedervi AT ALL.
2. L'altra opzione è decifrare il file immediatamente, scrivere l'output decrittografato su disco, dopo che l'intero file è stato elaborato calcola HMAC - se non è uguale al valore HMAC dall'intestazione del file, restituisci errore "file danneggiato" ed elimina l'output decrittografato dal disco (poiché lo consideriamo non valido). Questo meccanismo aumenta la velocità generale del processo di decrittografia, poiché il file di input viene letto una sola volta. D'altra parte, se il file di input è compromesso, non sono stati scritti i dati decrittografati su disco, poiché, dal momento che il confronto HMAC non è riuscito, dovrebbero essere (e saranno) cancellati dopo il controllo HMAC.
La scrittura di dati decifrati da file crittografati potenzialmente manomessi compromette la sicurezza? Come potrebbe aiutare un aggressore? Come supponiamo che l'hacker sappia tutto tranne la password, lui / lei sarebbe in grado di decifrare il file compromesso come descritto nell'opzione 2. Ma non sono in grado di dire se questo lo aiuterà in qualche modo.
Altrimenti, supponiamo che per la crittografia vengano utilizzate password lunghe e casuali, il cifrario utilizzato è anche sicuro, l'autenticazione della password avviene tramite KDF (PBKDF2, scrypt, qualunque cosa), quindi, come sopra descritto, il mio solo preoccupazione è come eseguire correttamente l'autenticazione.
EDIT: per favore, non rispondere NON come "devi prima crittografare, quindi HMAC". La domanda NON riguarda questo. Criptico sempre, quindi HMAC. La domanda è: dovrei HMAC, quindi decrypt o viceversa?
Grazie per l'attenzione.