Estoy creando un sistema para almacenar la versión con hash de algunos secretos. He leído el blog de Dropbox sobre cómo almacenan sus contraseñas, y se han inspirado en lo que están haciendo.
Dropbox, según tengo entendido, hace esto:
- Obtener contraseña
- Hash unidireccional con SHA512 (para combatir el posible truncamiento de la contraseña en bcrypt)
- Hash unidireccional con bcrypt
- Cifrado bidireccional con cifrado basado en contraseña AES256 con contraseña global del lado del servidor
- Almacenar en la base de datos.
Veo una debilidad potencial con este sistema en el punto 4.
Cuando se utiliza el cifrado basado en contraseña del lado del servidor, el cifrado del valor bcrypt, ¿los encabezados predecibles de bcrypt debilitarán la estrategia?
El hash bcrypt se ve así:
$2a$10$q16tPq1UQXP9n8yrcm0TMeWriU4F..i4S5Gs78zBWKDG3ourZXvCK
El inicio, encabezado, probablemente será siempre el mismo para el mismo sistema: $2a$10$
. Por supuesto, pueden tener algún otro valor, pero lo más probable es que se compartan entre todos los hashes de contraseña almacenados.
Por lo tanto, para el sistema de cifrado basado en contraseña, un atacante podría buscar patrones que coincidan con este encabezado y, posiblemente, encontrar su contraseña de cifrado.
¿Sería un mejor enfoque extraer los encabezados de bcrypt y, a continuación, cifrar solo el resto de sal + hash?
Según tengo entendido, esto no tendrá ningún componente predecible y, por lo tanto, será más seguro.
Estoy haciendo esto en java actualmente. Tal vez hay algunas soluciones preexistentes para este tipo de problema?
(PS. Soy bastante nuevo en criptografía, así que corríjame si utilizo la jerga / etiquetas incorrectas, etc.)