Supongamos que se utiliza un servidor que no es de confianza para almacenar los datos confidenciales de los usuarios (cifrados en el lado del cliente), y ambas tareas, la autenticación y el cifrado / descifrado, deberían poder realizarse con una sola contraseña. ¿Sería suficiente con:
- Reforzar la contraseña con una función de derivación de clave lenta y una sal trivial
[1]
, que producek
; - Utilice
k
como la "contraseña" de SRP, autenticándose con el servidor y recibiendo el texto cifrado; - Descifre el texto cifrado para obtener la (s) clave (s) real (es) que se usarán para firmar, encriptar, etc.
Un servidor malintencionado (bajo riesgo) tendría que realizar un ataque de diccionario sin conexión: en el verificador o en el texto cifrado: para recuperar k
, mientras que un atacante externo (mayor riesgo) solo podría realizar ataques en línea (ya que no tiene acceso ni al verificador ni al texto cifrado), a menos que obtenga una copia de la base de datos, lo que solo póngalo en una situación similar del servidor [2]
.
¿Es correcto este razonamiento? ¿Alguna falla que no haya anticipado? Algunas notas:
- Yo digo que la sal es "trivial" porque es: a) vacía; b) derivado del nombre de usuario; c) Aleatorio, pero el servidor se lo dará a quien lo solicite. Normalmente eso sería una preocupación , pero aquí la clave nunca abandona la máquina cliente, por lo que no importa si dos usuarios tienen la misma clave.
-
Una de mis preocupaciones es que un atacante podría crear una tabla de arco iris dirigida a un usuario en particular, luego obtener la base de datos e iniciar sesión casi de inmediato como ese usuario, ya que forzar de manera brutal al verificador o el texto cifrado es más rápido si tiene una lista de claves candidatas en lugar de una lista de contraseñas candidatas (que aún deben estirarse antes de convertirse en claves).
Por supuesto, si un atacante tiene esa capacidad de computación (o si la contraseña era débil), eventualmente se descifrará cualquier texto cifrado filtrado, pero se podrían evitar daños futuros si el servidor fuera más fuerte en este escenario (antes de aprender sobre el SRP que diseñé un protocolo más enrevesado que tuvo esto en cuenta, pero fue más inútil y tuvo preguntas abiertas).
- [Para mi caso particular] Todo esto está fuera del alcance de la pregunta (suponga que ya se ha resuelto): toda la comunicación se realizará a través de TLS, se dará la opción de usar las claves adecuadas y se otorgará la autenticación de 2 factores (pero no es obligatorio) , el código del cliente no provendrá del servidor que no sea de confianza, se usarán los MAC, etc.