Sí, sí, lo sé "no inventes tus propios protocolos a menos que seas un experto". No es necesario que me grites, solo quiero saber si hay una falla en esta idea y si no, alguien la ha hecho antes.
La motivación aquí es que quiero poder autenticar a los usuarios. Sé que la solución estándar es saltear y hash contraseñas. Pero no me gusta el hecho de que la propia contraseña debe enviarse al servidor para verificarla. ¿Qué pasa si alguien escucha? El lado del cliente puede cifrar y enviar la contraseña, pero tampoco me gusta porque quizás mi clave de descifrado tenga pérdidas y alguien que haya registrado el tráfico web anterior pueda deducir todas las contraseñas. La autenticación no es un problema nuevo, por lo que no voy a insistir más en las ventajas y desventajas de las soluciones habituales.
Mi idea
Para cada usuario (a) el servidor almacena una clave pública (g ^ x_a) y la contraseña cifrada con esa clave pública (g ^ {x_a} * p_a). La clave privada asociada se destruyó rápidamente o (mejor aún, nunca se calculó). El generador de grupo g se mantiene para la generación de claves futuras. La relación habitual se aplica g ^ a * g ^ b = g ^ {a + b}. El proceso de autenticación es el siguiente
-
El usuario Alice solicita la autenticación
-
El servidor Bob genera una nueva clave pública temporal g ^ t (de nuevo sin una clave privada asociada). Bob multiplica esta clave pública temporal en sus datos de Alicia. Esto da como resultado g ^ t * g ^ {x_a} = g ^ {t + x_a} = g ^ {x_a} 'y g ^ t * g ^ {x_a} * p_a = g ^ {t + x_a} * p_a = g ^ {x_a} '* p_a. Bob se deshace de la clave pública temporal, dejándolo solo con una nueva clave pública (g ^ {x_a} ') y la contraseña de Alice cifrada con esta clave. Él le envía la nueva llave a Alicia.
-
Alice toma la clave dada por Bob y la usa para cifrar su contraseña. Ella le envía el valor cifrado a Bob.
-
Bob autentica a Alice si el valor dado coincide con los datos cifrados calculados en el paso 2.
Para recapitular
-
En ningún momento el servidor (o un pirata informático de la base de datos) puede descifrar la contraseña. Una vez que las claves privadas han desaparecido, el cifrado de la clave pública funciona efectivamente como un hash.
-
Dado que cada usuario está encriptado con una clave diferente, las contraseñas son efectivamente saladas. Una mesa de arco iris no funcionaría aquí.
-
Un pirata informático con una imagen anterior de la base de datos no puede deducir valores futuros de g ^ x_a * p_a escuchando el tráfico web, ya que eso requeriría deducir la clave temporal (lo que requiere resolver un registro discreto). Por lo tanto, una imagen de base de datos filtrada no permite que un atacante suplante a los usuarios.
-
Ni el servidor ni el cliente tienen claves privadas para administrar. Solo el cliente necesita mantener la información secreta y la información secreta puede ser legible para los humanos.
-
(inconveniente) un atacante tiene una pequeña ventana de tiempo entre los pasos 2 y 4 donde puede penetrar en el servidor y hacerse pasar por un usuario utilizando los datos que encontró.