claves de búsqueda cifradas para el almacén de valores clave

1

Me gustaría usar un almacén de valores clave (cassandra, redis, ...), pero no confío en el servidor.

Los clientes tienen un secreto compartido, y lo estoy usando para cifrar los valores almacenados. Pero, ¿cuál es la forma correcta de cifrar las claves (no las claves criptográficas, las claves de almacenamiento de valor-clave)?

  1. El almacén compara claves en las consultas, por lo que cada clave de texto simple debe tener solo una clave cifrada correspondiente.

  2. Obviamente, si un atacante se apodera de la clave cifrada, debe ser tan fácil como sea posible encontrar la clave de texto simple.

  3. Menos obvio, si un atacante puede adivinar la clave de texto simple, debe ser imposible obtener la clave cifrada sin el secreto. No quiero que un atacante pueda confirmar si una clave determinada está presente en el almacén de valores-clave.

  4. Las colisiones (diferentes claves de texto sin formato con igual clave encriptada) deben ser tan raras que un atacante no las puede crear a propósito.

El cifrado simétrico con vectores de inicialización aleatorios o el hashing con sales está prohibido por (1). Un hash de la clave de texto simple sin sal no cumple (3).

Veo dos opciones:

  1. cifrar con un IV estático.

  2. hash(secret || plaintext-key)

El primero se siente como improvisar una función hash con un cifrado. También permitiría el descifrado, que no necesito. Edición: como la IV no es aleatoria, las claves de texto simple con el mismo prefijo seguirán teniendo el mismo prefijo en el texto cifrado, lo que puede permitir el razonamiento sobre el texto simple.

El último es almacenar el secreto de hash, pero sin las precauciones habituales, como la salazón y el estiramiento de las llaves. Edición: también es vulnerable a Length_extension_attacks .

    
pregunta Stefan 26.08.2014 - 22:41
fuente

1 respuesta

1

He encontrado la respuesta. Resulta que lo que pedí se llama código de autenticación de mensaje o MAC . Existen varias implementaciones para ello, basadas en funciones hash y cifrados en bloque.

HMAC está usando el patrón hash(key || hash(key || message)) con algún relleno adicional.

    
respondido por el Stefan 28.08.2014 - 01:41
fuente

Lea otras preguntas en las etiquetas