2010-04-06 15 views
13

Si un atacante tiene varios elementos distintos (por ejemplo, direcciones de correo electrónico) y conoce el valor cifrado de cada elemento, ¿puede el atacante determinar más fácilmente la contraseña secreta utilizada para encriptar esos elementos? Es decir, ¿pueden determinar la frase de contraseña sin recurrir a la fuerza bruta?Si el atacante tiene datos originales y datos cifrados, ¿pueden determinar la frase de contraseña?

Esta pregunta puede sonar extraño, así que me proporciono un caso de uso:

  1. usuario se suscriba a un sitio con su dirección de correo electrónico
  2. servidor envía esa dirección de correo electrónico de una URL de confirmación (por ejemplo: https://my.app.com/confirmEmailAddress/bill%40yahoo.com)
  3. El atacante puede adivinar la URL de confirmación y, por lo tanto, puede registrarse con la dirección de correo electrónico de otra persona y 'confirmarla' sin tener que iniciar sesión en la cuenta de correo electrónico de esa persona y ver la URL de confirmación. Esto es un problema.
  4. En lugar de enviar el texto sin formato de la dirección de correo electrónico en la URL, lo enviaremos cifrado por una contraseña secreta.
  5. (Sé que el atacante aún podría interceptar el correo electrónico enviado por el servidor, ya que el correo electrónico es texto plano, pero tenga paciencia aquí)
  6. Si un atacante se registra con varios correos electrónicos gratuitos cuentas y ve múltiples URL, cada una con la dirección de correo electrónico cifrada correspondiente, ¿podría el atacante determinar más fácilmente la frase de contraseña utilizada para el cifrado?

Solución Alternativa

pude vez enviar un número aleatorio o hash unidireccional de su dirección de correo electrónico (más sal al azar). Esto elimina el almacenamiento de la contraseña secreta, pero significa que necesito almacenar ese número aleatorio/hash en la base de datos. El enfoque original anterior no requiere almacenamiento en la base de datos.

Me estoy inclinando por el one-way-hash-stored-in-the-db, pero aún me gustaría saber la respuesta: si tener varias direcciones de correo electrónico no encriptadas y sus contrapartes encriptadas lo hace más fácil para determinar la frase de contraseña utilizada?

+0

¿por qué no eliminar todo su problema aplicando una solución de identidad federada como OpenId? –

+1

Su solución alternativa no requiere una tabla adicional, simplemente una columna adicional en la tabla existente que ya almacena la dirección de correo electrónico – Gareth

+0

@Gareth Tiene razón, y he actualizado la pregunta. ¡Gracias! –

Respuesta

3

Aunque probablemente, con algunas investigaciones, elija un método criptográfico suficientemente fuerte para resistir el conocido ataque de texto sin formato, ¿realmente vale la pena solo para evitar almacenar un hash en su base de datos?

El uso de una sola frase de contraseña para encriptar todas las solicitudes de registro parece que está agregando una vulnerabilidad de punto único innecesaria: si un atacante descifra esa frase de paso, puede registrar tantas cuentas como desee. Si, por otro lado, genera para cada nueva cuenta solicitar un hash único (de dirección de correo electrónico + número aleatorio, por ejemplo) para autenticar la URL de confirmación, incluso un pirata informático que intercepta el correo electrónico de confirmación de la cuenta A no está más cerca para obtener acceso a B, C o D.

Probablemente desee almacenar alguna información de estado sobre el proceso de confirmación en una base de datos de todos modos: probablemente exista un límite de tiempo sobre cuánto tiempo es válida la URL de confirmación.

+0

En realidad, creo que las vulnerabilidades debidas a la mala generación de hashes/secrets 'aleatorios' son al menos tan probables, si no más, como los riesgos de introducir una sola clave secreta. –

5

Sí, hace que sea más fácil. En general, mientras más información tenga el atacante, más fácil será su trabajo. Este ejemplo específico se llama known-plaintext attack.

+5

Pero para un método de encriptación bien diseñado, sigue siendo tan difícil que no es un problema. – starblue

+4

Las cifras modernas están diseñadas para resistir no solo los ataques de texto claro conocidos, sino también los ataques de texto cifrado adaptables. Diseñar su protocolo suponiendo que sus primitivos son débiles es un gran error; elige primitivas de confianza. –

12

Lo que está describiendo es un known-plaintext attack. Las cifras clásicas eran muy vulnerables a este tipo de ataque, pero las cifras modernas están diseñadas para resistirlo.

Querrá leer un poco sobre criptografía.

+1

+1 para la recomendación de leer en Crypto. – fbrereto

+4

cualquier lectura sugerida? –

3

Lo que necesita no es cifrado, es la autenticación. En el enlace que envía a los clientes, incluye no solo su dirección de correo electrónico, sino también una marca de tiempo y lo que se denomina MAC, que es un campo de autenticación basado en claves simétricas. El MAC debería autenticar tanto la dirección de correo electrónico como la marca de tiempo. El HMAC-SHA1 de 64 bits debería hacerlo. Cuando reciba el enlace, verifique que la marca de tiempo no sea demasiado antigua y el MAC verifique; entonces sabes que generó el enlace.

Los MAC están diseñados para resistir ataques donde los atacantes pueden elegir mensajes y solicitar los MAC correspondientes, por lo que no tiene que preocuparse por el equivalente MAC de un "ataque conocido de texto claro".

1

Hay un escenario donde la respuesta es SÍ !!! Y eso es si usa un cifrado de flujo, como RC4.

RC4 es esencialmente un generador de números aleatorios que simplemente XOR el texto en claro con un 'flujo de clave' derivada de su clave:

P0^K0 = C0
P1^K1 = C1
P2^K2 = C2
.
.
PN^KN = CN

Si tiene tanto el texto en claro y el texto cifrado, se puede hacer esto:

C0^P0 = K0
C1^P1 = K1
C2^P2 = K2

y así sucesivamente. Como puede ver, recupera la clave de la transmisión. No es la clave, sino la secuencia generada por la clave.

+0

¡ja, lindo! Estaba pensando más en las líneas de Triple DES o AES en lugar de XOR, pero gracias por la sugerencia. –

+0

RC4 está roto y no debe usarse. Un cifrado de flujo moderno tendrá dos parámetros, la clave y el "nonce". La misma clave se puede usar muchas veces siempre que no se vuelva a utilizar nonce con una clave específica. Incluso si está utilizando Triple DES o AES, estas son cifras cifradas; cuando usa un modo de encadenamiento, los usa de manera efectiva para generar cifrado de flujo, por lo que se aplican las mismas consideraciones. Un modo de encadenamiento popular es el modo CTR, que utiliza XOR para combinar la secuencia con el texto sin formato. Todos los modos de encadenamiento seguro requieren que el nonce no se reutilice, no solo CTR. –

+0

"Todos los modos de encadenamiento seguro requieren que el nonce no se vuelva a utilizar" - es por eso que 'nonce' == 'number once' :-) –

Cuestiones relacionadas