Sto costruendo un piccolo strumento a linea di comando (principalmente per divertimento) destinato a memorizzare dati (come password o file) crittografati in un database locale, con una password fornita dall'utente, praticamente la stessa funzionalità di KeePass.
Sto cercando una recensione su quello che sto facendo per confermare che non sto lasciando alcun buco di sicurezza e sto usando correttamente algoritmi noti o se c'è troppa ridondanza.
È anche importante quanto resilienti i dati siano contro la forza bruta.
Il processo è il seguente:
Crittografia:
-
L'utente fornisce una password e dati
-
Due chiavi da 32 byte derivano dalla password dell'utente (chiamatela d_key e s_key), usando PBKDF2 con un RNG (os urandom) di 16 byte (diverso sale per ogni chiave) e 10000 iterazioni (configurabile)
-
I dati vengono crittografati utilizzando AES CTR con d_key e una firma viene calcolata dal testo cifrato utilizzando HMAC sha512 con s_key
-
Sia il testo cifrato che le firme hmac sono archiviati nel database, insieme ai sali usati e al conteggio delle iterazioni.
Decodifica:
-
L'utente inserisce la sua password e l'ID dei dati che desidera recuperare
-
d_key e s_key vengono generati utilizzando i sali memorizzati e il conteggio delle iterazioni.
-
I dati vengono caricati decrittografati usando d_key
-
HMAC viene ricalcolato dai dati crittografati, utilizzando s_key e confrontato con quello memorizzato per confermare che i dati non sono stati modificati e la chiave è valida.
-
Tutto bene, dati restituiti all'utente.
Ora la mia domanda principale è, HMAC sembra ridondante, ma sembra l'unico buon modo per verificare che la chiave sia valida, altrimenti sarebbe necessario confrontare un hash dei dati in testo semplice, il che sarebbe molto facile da decodificare / forza bruta.
Inoltre, ho davvero bisogno di due chiavi separate per AES e HMAC? Anche se stai usando un sale?
Infine, PBKDF2 aiuta davvero? O sarebbe lo stesso usare semplicemente una funzione di hash per derivare la chiave? Dal momento che la chiave non è memorizzata da nessuna parte, sembra ridondante, anche se suppongo che se la chiave non è salata e la bruta iterata potrebbe essere più semplice.