Cuando se hacen hashing de las contraseñas, ¿está bien almacenar el algoritmo utilizado allí mismo en la base de datos?

5

Debido a que la contraseña de hash se ha convertido en un tema candente recientemente, es natural esperar que las cosas cambien y supongamos que en algún momento es posible que desee reemplazar / modificar el algoritmo utilizado en su sistema. Eso naturalmente resultaría en diferentes tipos de hashes almacenados para usuarios antiguos y nuevos.

Me pregunto si sería aceptable si simplemente almacenara el algoritmo utilizado en la base de datos ante cada hash. Algo similar a cómo se ve la salida de bcrypt: $2a$... (la versión del algoritmo). ¿Qué pasa si lo almacené por nombre como sha1$f6238eb6ca... ?

¿Empeora considerablemente el hecho de exponer explícitamente el algoritmo utilizado? Estoy pensando que, incluso si el atacante conoce el algoritmo exacto (de muy pocos) es más o menos el mismo orden de trabajo descifrarlo, x1 o x5 no es un gran problema, el mismo O (esfuerzo). Pero me facilita la gestión de las cosas.

¿Qué piensan los expertos?

Actualizar. Estaba pensando en otra opción, como referirme a un algoritmo en particular mediante códigos como alg1, alg2 y escribir las explicaciones de esas referencias en algún otro lugar, en la aplicación, tal vez, para mantener esta información a mano. Si mi idea original resultara mala, ¿este enfoque la corregiría?

    
pregunta anon_user 21.01.2013 - 01:54
fuente

5 respuestas

12

Claro que está bien. Esta es una aplicación simple del principio de Kerckhoffs : el secreto no está en el algoritmo, sino en la clave o contraseña. Para empezar, cualquier persona que tenga acceso a su implementación, a su documentación, o que sepa qué es lo que soportan las bibliotecas con las que se construye su aplicación, sabe qué algoritmo (s) puede estar usando su aplicación. A lo sumo, el atacante tendría que probar una pequeña lista. Y si hay varias posibilidades, su aplicación también tendría que probar esa lista, haciendo que la autenticación sea más lenta sin una buena razón (aumenta su propia carga de trabajo en la misma cantidad que el atacante).

Como se ha dado cuenta, es una práctica común anteponer la identificación del algoritmo a la sal y al hash. Por supuesto, la práctica común no siempre es sensata, pero aquí está. Bcrypt utiliza códigos numéricos heredados de la práctica de Unix. Si lo prefiere, puede usar su propio esquema de nomenclatura, aunque como de costumbre, debe atenerse a lo que proporciona su biblioteca, a menos que tenga una buena razón para hacer lo suyo.

    
respondido por el Gilles 21.01.2013 - 02:17
fuente
2

No empeora las cosas haciendo esto, y de hecho, muchas soluciones de almacenamiento de hash hacen exactamente esto (similar a su ejemplo de salida de bcrypt) para que el sistema operativo (o la aplicación) sepa qué algoritmo de hash usar para comparar con los almacenados hash.

La seguridad no depende de mantener el algoritmo en secreto de ninguna manera, se basa en que el algoritmo es lo suficientemente robusto como para que las posibilidades de que dos contraseñas entreguen el mismo hash en circunstancias normales sean increíblemente bajas, y el esfuerzo requerido para comparar la fuerza bruta hashes generados es lo más alto posible.

    
respondido por el Rory Alsop 21.01.2013 - 02:15
fuente
0

Normalmente, la longitud de la salida de hash es suficiente para revelar ese secreto:

MD5: 128 bits
SHA1: 160 bits
SHA256: 256 bits
SHA512 : 512 bits

Intentar mantener su algoritmo en secreto es una batalla perdida. Desea seguridad a través del secreto , no seguridad a través de la oscuridad .

    
respondido por el tylerl 21.01.2013 - 02:43
fuente
0

Como otros ya han explicado, tratar de mantener el algoritmo en secreto no es una buena idea. Sin embargo, si desea protección adicional contra ataques que comprometen la base de datos pero no el código ejecutable, puede almacenar un valor y / o algoritmo secreto de "pimienta" en el código, para que el atacante tenga que averiguar qué es exactamente lo que hace. con los datos antes de que lo hash. Tratar de mantener el algoritmo en secreto en este caso aún proporciona poca seguridad (ya que no es tan difícil de descifrar), pero mantener el secreto clave complicará considerablemente cualquier ataque.

Consulte ¿Cómo hash seguro las contraseñas? para obtener más información sobre el tema .

    
respondido por el Shnatsel 21.01.2013 - 03:20
fuente
0

En primer lugar, el requisito de los estándares de cifrado modernos fue que el hecho de haber conocido un algoritmo por parte de los atacantes no reduce la protección del sistema si se cumplen todas las reglas, en particular, para las claves.

Piensa que muchos de los algoritmos son de código abierto, de hecho, cualquiera en Linux. Así que el concepto básico de seguridad aquí es la fuerza de las claves utilizadas.

    
respondido por el Ruslan Gerasimov 12.08.2014 - 02:52
fuente

Lea otras preguntas en las etiquetas