Estoy trabajando en un programa de prueba de concepto para cifrar el correo electrónico con menos dificultad para los usuarios finales con un proceso como:
Para crear una cuenta:
- Genere un salt aleatorio y IV, y obtenga una contraseña del usuario.
- Genere una clave de 384 bits con PBDKF2-HMAC-SHA512 (o quizás scrypt?).
- Dividir eso en tres claves de 128 bits (k1, k2, k3).
- Genere un par de claves RSA (para GPG ).
- Encripta la clave privada con k3.
- Genere un HMAC de la clave privada cifrada, utilizando k2.
- Envíe la sal, IV, k1, número de iteraciones, clave pública, HMAC y clave privada encriptada al servidor.
Para iniciar sesión:
- Solicite nuestra sal y la cantidad de iteraciones del servidor (tal vez haga algo aquí para evitar la pérdida de direcciones de correo electrónico).
- Regenera k1, k2, k3 con PBKDF2.
- Envíe k1 al servidor, que lo compara con su versión almacenada. Esto se utiliza para evitar que la clave cifrada sea pública. En teoría, esto no debería importar, pero parece mejor proteger los datos cifrados por si acaso.
- Si k1 coincide, el servidor devuelve una clave privada cifrada AES-128 y una IV, con un HMAC-SHA-1 MAC.
- Use k2 para verificar el HMAC.
- Use k3 para descifrar la clave privada.
Para futuros inicios de sesión, podemos simplificar las cosas ya que el servidor tiene la clave pública y nosotros tenemos la clave privada.
La idea es que incluso si el servidor está comprometido, la única información que tiene es k1, la sal, la IV y la clave privada cifrada, pero para alterar la clave, necesita k2 y descifrar la clave necesita k3.
Dado que el cliente solo necesita descifrar la clave una vez (y luego puede almacenarla en el conjunto de claves de su sistema operativo), el número de iteraciones podría ser realmente alto.
¿Tengo razón al suponer que esto protegería a los clientes contra un servidor comprometido? Creo que los únicos vectores de ataque restantes serían piratear al cliente, forzar brutalmente la contraseña (lo que debería ser increíblemente difícil, ya que podemos usar muchas iteraciones de PBKDF2) y el criptoanálisis de la manguera de goma.
EDITAR: Más específicamente, esto está destinado a proteger la contraseña de un usuario, la clave privada y los correos electrónicos cifrados de un atacante, incluso si ese atacante está trabajando con el propietario del servidor. Los correos electrónicos no cifrados son básicamente imposibles de proteger, ya que un atacante que controla el servidor podría simplemente salvarlos a medida que ingresan. La ingeniería social y el criptoanálisis de manguera de goma son relevantes, pero mi objetivo fue principalmente reducir los posibles ataques a los que pueden No te mantengas en secreto.