Seguridad del recifrado con una lista de claves basadas en contraseñas pre-calculadas

2

Tengo un problema en el que un archivo cifrado almacenado en un servidor debe ser descifrado a través de una lista precomputada de contraseñas que se usan solo una vez: OTP se aplica básicamente al cifrado. El archivo se encuentra en un estado seguro mientras está activo y descifrado, no se puede modificar ni ver públicamente. Mientras está en reposo, se puede ver y modificar públicamente, por lo que no puedo almacenar una lista de contraseñas en el servidor, ya que el servidor a menudo no está en un estado seguro y el archivo debe transferirse a menudo de manera muy pública. manera en que será casi definitivamente visto. Después de discutir esto con un amigo, se sugirió algo basado en Diffie-Hellman. Mi pregunta es qué tan seguro podría ser.

Concepto
La idea es generar una lista de hashes y almacenar solo la lista de g^H_n junto con el archivo cifrado. El archivo se cifra cada vez tomando un hash, g^H_n , un valor de trabajo aleatorio r y cifrando el archivo con la clave (g^H_n)^r . Finalmente, g^r se almacena públicamente en el archivo. Para descifrar, el usuario proporciona H_n que se puede usar para calcular (g^r)^H_n y descifrar el archivo. Luego, volver a cifrar es simplemente hacer lo mismo con g^H_(n-1) tomado de la lista y un nuevo valor de trabajo aleatorio.

Si en algún punto alguien obtiene el archivo públicamente (como cuando el archivo está en reposo), solo sabrán g^r , que no se puede usar para calcular la clave. Aparte del último hash utilizado para cifrar, todos los demás hash se cifran junto con el archivo, por lo que las claves futuras tampoco se pueden manipular.

Pregunta
Parece que funcionaría bastante bien, pero estoy nervioso por hacer algo como esto sin saber con qué facilidad podría romperse, y no puedo encontrar ningún método existente para hacer lo mismo. Espero que alguien pueda señalar cualquier falla importante en esto que se haya pasado por alto.

    
pregunta Dave 17.10.2012 - 19:03
fuente

1 respuesta

3

Si entiendo tu problema correctamente, lo que quieres es que, para un archivo dado:

  • Un archivo se almacena en un servidor no confiable.
  • Hay una lista ordenada de contraseñas que están "adjuntas" al archivo (pero bit almacenado con el archivo).
  • Cuando está en reposo, el archivo se cifrará con la primera contraseña de la lista (es decir, se cifrará con una clave que se puede volver a calcular a partir del conocimiento de la contraseña).
  • Cuando la contraseña se envía al servidor, server descifra el archivo con ella, hace "algo" con los datos descifrados (p. ej., la devuelve al usuario) y vuelve a cifrar el archivo con la contraseña. siguiente contraseña en la lista.
  • El servidor no tiene conocimiento permanente de las contraseñas en sí mismas.

Esto implica que hay momentos en que el servidor "ve" los datos descifrados, por lo que el servidor no debe ser totalmente confiable. Supongo que estamos interesados en proteger los datos en reposo (escenario: el atacante roba una cinta de respaldo para el servidor y, por lo tanto, tiene acceso de lectura a los archivos almacenados, pero no a la memoria RAM del servidor). No estoy estudiando ataques activos aquí; si el atacante puede modificar los datos del servidor, entonces tiene mayores problemas. Otro punto importante es que lo que contiene el servidor es necesariamente vulnerable a ataques de diccionario (conocimiento de qué el servidor sabe, más la contraseña actual, es suficiente para recuperar los datos) por lo que las contraseñas deben ser fuertes (alta entropía, bcrypt ...).

Las características anteriores implican que el servidor debe poder cifrar en relación con una contraseña que no conoce, por lo que esto requiere una criptografía asimétrica. Lo que sugiere es funcionalmente equivalente a almacenar con el archivo una secuencia de claves privadas protegidas por contraseña, junto con sus claves públicas: la contraseña, cuando se proporciona, desbloquea la clave privada, que se usa para el descifrado, y el reencryption inmediato usa el siguiente clave pública en la lista. Su g H n es solo una protección de contraseña de clave privada: la clave privada es la (hash de la) contraseña, y el valor almacenado es la clave pública.

Si desea atenerse a los estándares bien estudiados (¡lo cual es inteligente!), considere OpenPGP . Incluye formatos para el almacenamiento de claves públicas, claves privadas protegidas por contraseña y cifrado de datos en masa. Es compatible con las bibliotecas existentes (por ejemplo, GnuPG o Bouncy Castle ).

Se podría definir un formato simplificado según las líneas que usted pensó (posiblemente con curvas elípticas, para reducir el tamaño de la lista de claves), pero sería un esfuerzo bastante grande con muchas cosas que pueden salir mal (el El hash de contraseña, el cifrado simétrico, los detalles de Diffe-Hellman, un posible direccionamiento indirecto para acelerar el paso de cifrado ... todo se agrega a la complejidad).

    
respondido por el Thomas Pornin 17.10.2012 - 19:44
fuente

Lea otras preguntas en las etiquetas