Sto creando un sistema per archiviare la versione hash di alcuni segreti. Ho letto il blog di Dropbox su come memorizzano i loro password e hanno preso ispirazione da ciò che stanno facendo.
Dropbox, per quanto ho capito, fa questo:
- Ottieni password
- Hash unidirezionale con SHA512 (per combattere il possibile troncamento della password in bcrypt)
- Hash unidirezionale con bcrypt
- Codifica bidirezionale con crittografia basata su password AES256 con password globale lato server
- Archivia nel database.
Vedo un potenziale punto debole con questo sistema al punto 4.
Quando si utilizza la crittografia basata su password lato server, crittografando il valore bcrypt, le prevedibili intestazioni di bcrypt indeboliranno la strategia?
L'hash di bcrypt ha un aspetto simile al seguente:
$2a$10$q16tPq1UQXP9n8yrcm0TMeWriU4F..i4S5Gs78zBWKDG3ourZXvCK
L'inizio, l'intestazione, molto probabilmente sarà sempre lo stesso per lo stesso sistema: $2a$10$
. Certo, potrebbero essere un altro valore, ma sono probabilmente condivisi tra tutti gli hash delle password memorizzati.
Pertanto, per il sistema di crittografia basato su password, un utente malintenzionato potrebbe quindi cercare i modelli che corrispondono a questa intestazione e potenzialmente trovare la password di crittografia.
Un approccio migliore sarebbe quello di estrarre le intestazioni di bcrypt e quindi criptare solo il restante salt + hash?
Per quanto ho capito, questo non avrà alcun componente prevedibile e quindi sarà più sicuro.
Sto facendo questo in java al momento. Forse ci sono alcune soluzioni pre-esistenti per questo tipo di problema?
(PS. Sono abbastanza nuovo in crittografia, quindi correggimi se uso il gergo / tag sbagliato ecc.)