¿Es una mala práctica prefijar mi hash con el algoritmo usado?

54

Digamos que tengo una base de datos con un grupo de usuarios en ella. Esta base de datos de usuario normalmente tendría una contraseña hash por usuario. ¿Sería una mala práctica prefijar este hash con el algoritmo de hash utilizado?

Por ejemplo, en lugar del hash aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d , almaceno sha1_aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d , ya que el método para hacer el hash es SHA1.

Me di cuenta de que Argon2 hace esto, y en realidad creo que es bastante conveniente, ya que hace que sea más fácil migrar parcialmente a nuevos algoritmos de hashing para usuarios más nuevos a lo largo del tiempo.

No uso SHA1 en mi código de producción para las contraseñas. SHA1 fue elegido al azar. Esta pregunta no es sobre el uso del método hash.

    
pregunta Mathias Lykkegaard Lorenzen 08.11.2018 - 14:25
fuente

5 respuestas

116

Muchos sistemas de hashing de contraseñas diferentes hacen esto. El tipo de mecanismo de hash utilizado no debería ser (y no debería ser necesario) un secreto. principio de Kerckhoffs dice:

  

Un criptosistema debe ser seguro incluso si todo sobre el sistema,   excepto la clave, es de conocimiento público.

Por lo tanto, si su sistema es seguro, no debería importar si el mecanismo hash está expuesto.

    
respondido por el schroeder 08.11.2018 - 14:28
fuente
39

Estoy de acuerdo con schroeder en que está bien hacerlo. Incluso sin un prefijo, un atacante probablemente pueda averiguar qué algoritmo está usando. Y de todos modos, es la fuerza del algoritmo de hash que protege las contraseñas, no el secreto del algoritmo.

Tenga en cuenta que muchos algoritmos de hash y bibliotecas ya lo hacen por usted. Incorporan toda la información relevante (algoritmo, factores de costo, sal, el hash real) en una cadena serializada. Consulte, por ejemplo, el Formato de cripta modular o el PHP password_hash . Así que no vayas a hacer tu propio esquema. Si está utilizando una biblioteca de hashing descendente, ya tiene una.

Sin embargo, no use SHA1 para hash de contraseñas. Eso no está bien.

    
respondido por el Anders 08.11.2018 - 14:41
fuente
13

No, no es una mala práctica, y podría decirse que debería mantener esta información.

Como puede observar, esto le permite cambiar el algoritmo para nuevas contraseñas siempre que lo desee, sin invalidar las contraseñas existentes de todos los usuarios (esto hace que sea impopular, por alguna razón).

Hay un argumento de que esto permite que un atacante busque las contraseñas antiguas y más débiles para atacar primero, pero no ha reducido su seguridad en absoluto (asumiendo el principio de Kerckhoff, que el algoritmo en sí no debe ser un secreto ).

    
respondido por el Toby Speight 08.11.2018 - 16:59
fuente
9

Es una buena práctica almacenar el algoritmo de hash, pero las funciones de hashing de contraseñas como Argon2 y PBKDF2 ya se encargan de esto. Sin embargo, es una mala práctica usar SHA1 o SHA256 solo para el hash de contraseñas porque son una cantidad fija (y relativamente pequeña) de trabajo de crack mediante ataques de diccionario y fuerza bruta. Esas contraseñas deben migrarse a una función de hash segura volviendo a grabar la contraseña en su próximo inicio de sesión. Consulte enlace para obtener más información.

    
respondido por el leo v 08.11.2018 - 20:27
fuente
1

No es una mala práctica, en realidad es algo común. De hecho, si abre el archivo /etc/shadow en una máquina Linux, verá que su contraseña de hash tiene el prefijo $ x $ salt $, donde x es un número que indica qué algoritmo de hash se utilizó.

Ahora algunas cosas a considerar:

  • no use SHA1 directamente como un algoritmo de hash. Use bcrypt, scrypt o argon2 en su lugar (lo que mencionó pero esto no se puede repetir demasiado). Estos utilizan un algoritmo de hashing simple como SHA1 como base, pero lo ejecutan de una manera especial que lo hace resistente a los ataques.
  • por razones prácticas, ya que está utilizando una base de datos y no un archivo, es posible que desee almacenar el método de hash y la sal en filas separadas. Sin embargo, también puede optar por almacenar la cadena que comienza con $ x $ salt $ en su base de datos, y analizar el método de sal y hashing de esa cadena en el momento de verificar la contraseña. Probablemente sea lo suficientemente rápido como para que no haya una diferencia significativa. Y en ambos casos, la seguridad de su sistema será la misma.
respondido por el Nicolas Marshall 09.11.2018 - 19:11
fuente

Lea otras preguntas en las etiquetas