Almacenar direcciones de correo electrónico encriptadas pero de manera determinista

0

Como parte de una aplicación que estoy desarrollando, debo almacenar las direcciones de correo electrónico de los usuarios en una base de datos en la nube. No se requiere que la dirección de correo electrónico esté en texto sin formato para el funcionamiento normal de la aplicación.

Por lo tanto, para brindar seguridad, la dirección de correo electrónico se cifra y luego se almacena en la base de datos. La dirección de correo electrónico en el formulario cifrado será el principal medio de identificación de los usuarios (es la clave principal).

Teniendo en cuenta estos hechos, cuál de los siguientes métodos de cifrado tiene sentido si el servidor de la base de datos es vulnerable a los ataques.

Método 1:

Encrypted-Email-Address = Asymmetric Cipher(Pub-Key2, 
               Asymmetric Cipher(Pub-Key1, Plain-text-Email-address))

No se utilizará ningún relleno aleatorio para permitir la asignación determinística entre las direcciones de correo electrónico simples y cifradas, por lo tanto, el cifrado dos veces

O

Método 2:

Encrypted-Email-Address = Symmetric Cipher(Key, Plain-text-Email-address)

Tenga en cuenta que debido a que no se requiere descifrado para el funcionamiento normal, las Claves privadas en el método 1 se almacenarán fuera de línea en el mundo físico. Sin embargo, el cifrado tendrá que ser determinista porque la dirección de correo electrónico es la clave principal.

Pasé por enlace . Pero allí el OP está buscando almacenar un campo de clave no principal, por lo que no puedo usarlo.

¿Conoce alguna metodología mejor que solucione este caso de uso?

    
pregunta dvlpr 30.09.2013 - 21:04
fuente

2 respuestas

0

Por lo que puedo decir, estás usando la dirección de correo electrónico para 2 propósitos diferentes, ¿por qué no almacenarla dos veces?

En una columna, puede almacenar una versión con hash, como si fuera una contraseña. Eso es determinista, por lo que puede usarlo para buscar un usuario por su dirección de correo electrónico.

Aunque, como han mencionado otros, no es una buena idea usarlo como clave principal. Use una clave sustituta (por ejemplo, un incremento automático) y cree un índice único en la columna de correo electrónico.

Luego, en una segunda columna, tendrías una versión cifrada asimétricamente que puedes descifrar con una clave privada sin conexión si alguna vez lo necesitas. Este no tendría que ser determinista, por lo que puede utilizar el cifrado asimétrico estándar.

    
respondido por el just me 01.10.2013 - 16:59
fuente
3

Las direcciones de correo electrónico están sujetas a enumeración. No hay tantas direcciones de correo electrónico. Cualquier esquema determinista que no utilice un secreto (es decir, ninguna clave que conozca un posible atacante) no hará nada contra eso. No sé qué supones que logra el "doble cifrado asimétrico" con dos claves públicas; pero sé que no soluciona ese problema central. Las claves públicas son públicas.

El cifrado simétrico , con una clave que el atacante no tiene, puede ser determinista y seguro ( si se hace correctamente ) pero esto difícilmente se aplica a su situación, ya que Si bien no necesita descifrado , sí necesita cifrar mucho, ya que la dirección de correo electrónico del usuario es lo que el usuario escribe.

Un problema adicional con las direcciones de correo electrónico es que no siempre son reproducibles: los usuarios pueden emplear diferentes carcasas (el caso no es significativo en la parte del dominio, después de '@', pero puede ser significativo en la parte local), use variantes (muchas personas tienen '[email protected]' y '[email protected]' como direcciones válidas) e incluyen "comentarios" (como en '[email protected]' ) con una noción específica de sitio de lo que constituye un "comentario". Como sugiere @Stephen, es mejor simplemente asignar una ID a cada usuario y usar esa ID como clave principal.

    
respondido por el Tom Leek 30.09.2013 - 23:42
fuente

Lea otras preguntas en las etiquetas