Desidero creare un sistema in cui I memorizzi i dati crittografati .
Gli utenti possono accedere a questi dati se hanno la chiave. Se danno una chiave sbagliata, non ottengono affatto accesso. Se danno la chiave giusta, ottengono i dati e possono modificare tali dati.
Un'idea che mi è venuta in mente è quella di memorizzare bcrypt
della chiave, un valore salt e AES
-codice crittografato utilizzando PBKDF2
con il valore salt e un numero di iterazione elevato.
Ottenere i dati seguirà questo processo:
- Ottieni la chiave dall'utente.
- Ottieni il bcrypt di quella chiave.
- Se il bcrypt non corrisponde, nega l'accesso.
- Ottieni il
PBKDF2
della chiave con il sale. - Utilizza quel
PBKDF2
per decrittografare i dati. - Fornisci i dati all'utente attraverso un canale sicuro (oltre questo design).
Il sistema dovrebbe rendere difficile l'acquisizione dei dati, anche se si ha accesso ai dati grezzi e crittografati.
Il mio design sembra raggiungere questo obiettivo, ma ho delle preoccupazioni di crittanalisi differenziale sul fatto che la chiave sia crittografata con bcrypt
e con una PBKDF2
che codifica AES
. È possibile incrociare il riferimento di bcrypt
e i dati raw, AES
-criptati rendono più semplice l'interruzione della chiave? Ci sono problemi noti con questo tipo di design?
C'è un modo più semplice?
Ovviamente non posso sbarazzarmi della parte bcrypt
, perché qualsiasi chiave decrittografa i dati di AES
(anche se il risultato sarebbe senza senso). Non riesco a utilizzare bcrypt
come chiave per AES
, perché la chiave verrà archiviata insieme ai dati crittografati, il che vanifica lo scopo della crittografia.