¿SHA1 de direcciones de correo electrónico siempre será única?

7

Queremos almacenar datos sobre una persona sin almacenar su dirección de correo electrónico, pero luego queremos conectar a esa persona con sus datos cuando le proporcionen su dirección de correo electrónico.

El almacenamiento de un SHA1 de su dirección de correo electrónico (en minúsculas) lo logrará, pero ¿es posible que dos direcciones de correo electrónico diferentes resulten en el mismo SHA1? Si es así, ¿cuál es la probabilidad?

Cesl

    
pregunta user19695 15.01.2013 - 19:36
fuente

3 respuestas

7
  • La posibilidad de que esto suceda por accidente es insignificante. Es aproximadamente n 2 / 2 159 cuando tiene n direcciones de correo electrónico. Por ejemplo, si tiene mil millones de correos electrónicos, la probabilidad es 2 -99 o 10 -30 .

    Asumir que no sucede por accidente es una apuesta bastante segura.

  • Alguien podrá crear dos direcciones de correo electrónico que tengan el mismo hash, pero no podrá crear un correo electrónico que coincida con el hash de otra persona que no sea idéntica al correo electrónico de esa persona.

    O como diría un criptógrafo, los ataques de colisión contra SHA-1 son posibles, pero las imágenes previas no lo son.

    Pero los ataques de colisión parecen irrelevantes para tu aplicación. Como no veo cómo un atacante aprovecharía la posesión de dos correos electrónicos con un hash coincidente.

  • Es posible adivinar el correo electrónico y confirmarlo contra un hash. El principal problema aquí es que SHA-1 es rápido.

    Corrí un ataque de ese tipo contra MD5 gravatar hashes stackoverflow del público publica , y se recuperó en torno al 28%. Alguien que ponga más esfuerzo probablemente podrá recuperarse un poco más.

Mi recomendación es usar una construcción de hashing costosa como PBKDF-2-HMAC-SHA-2 con una sal por aplicación.

    
respondido por el CodesInChaos 15.01.2013 - 19:52
fuente
4

Si toma las direcciones n , la probabilidad de una colisión (dos direcciones distintas que incluyen el hashing en el mismo valor) está cerca de n 2 * 2 -159 (para valores prácticos de n ). En la práctica, puede ignorar totalmente el riesgo de una colisión (su riesgo de ser muerto por un oso rabioso es mucho mayor que eso).

Tenga en cuenta que:

  • SHA-1 tiene algunas debilidades criptográficas, que hacen que sea más fácil para un individuo malintencionado crear a propósito dos direcciones de correo electrónico distintas que tengan el mismo valor. Esta es todavía una debilidad teórica, porque mientras el método descrito es más rápido que el costo teórico de 280 , todavía conlleva el número sustancial de 2 61 evaluaciones de la función hash. Además, podría ser difícil adaptar la colisión computada al formato de las direcciones de correo electrónico. De todos modos, puede ser un poco más cauteloso usar SHA-256 en lugar de SHA-1 (y se verá mejor si lo auditan).

  • Las direcciones de correo electrónico pueden no distinguir entre mayúsculas y minúsculas. En particular, el nombre de dominio (después de '@') es, por ley, no distingue mayúsculas y minúsculas, por lo que example.com , Example.COM y exAmPLE.cOM son todos equivalentes. Para lo que aparece antes del signo '@', esto depende del sitio. Es posible que desee realizar alguna normalización antes del hash, y es posible que no haya una buena solución que funcione para todas las direcciones de correo electrónico existentes.

Editar: aunque esto responde a su pregunta exacta, le recomendamos que consulte la respuesta de @CodeInChaos, que intenta ver un poco más en su problema: si es posible proporcionar una La dirección de correo electrónico y verifica que coincida con un hash almacenado, entonces hace posible "probar" las direcciones de correo electrónico potenciales contra el valor de hash, y tiende a funcionar. Esta es una variante del ataque de diccionario y puede o no ser un gran problema con su modelo de seguridad.

    
respondido por el Thomas Pornin 15.01.2013 - 19:52
fuente
1

El término para esto es (SHA1) colisión y hay numerosos recursos en Internet al respecto.

El número de direcciones de correo electrónico y el problema de cumpleaños aumentarán las posibilidades de colisión, pero para este uso práctico, el lo más probable es que nunca tendrá una colisión.

Debería esperar diferentes problemas, como direcciones de correo electrónico con puntos. Gmail ignorará cualquier punto en la dirección de correo electrónico, por lo que first.name.lastname@gmail.com es el mismo que firstnamelastname@gmail.com pero el hash será diferente.

    
respondido por el Cristian Dobre 15.01.2013 - 19:52
fuente

Lea otras preguntas en las etiquetas