it-swarm-es.com

Salado tu contraseña: ¿Mejores prácticas?

Siempre he tenido curiosidad ... ¿Qué es mejor cuando se agrega una contraseña para el hashing: prefix o postfix? ¿Por qué? ¿O importa, siempre y cuando usted sal?

Para explicar: Todos (con suerte) ya sabemos que deberíamos salt una contraseña antes de guardarla en la base de datos para guardarla en la base de datos [ Editar: Para evitar cosas como qué sucedió Jeff Atwood recientemente ]. Normalmente, esto se hace concatenando el salt con la contraseña antes de pasarla a través del algoritmo de hashing. Pero los ejemplos varían ... Algunos ejemplos preceden a la sal antes de la contraseña. Algunos ejemplos agregan la sal después la contraseña. Incluso he visto algunos que intentan poner la sal en el medio.

Entonces, ¿cuál es el mejor método y por qué? ¿Hay algún método que disminuya la posibilidad de una colisión de hash? Mi Google no ha encontrado un análisis decente sobre el tema.

Editar: ¡Grandes respuestas amigos! Lo siento, sólo pude elegir una respuesta. :)

155
Randolpho

El prefijo o el sufijo es irrelevante, solo se trata de agregar algo de entropía y longitud a la contraseña.

Debes considerar esas tres cosas:

  1. La sal tiene que ser diferente para cada contraseña que almacenes. (Este es un malentendido bastante común.)
  2. Utilice un generador de números aleatorios criptográficamente seguro.
  3. Elija una sal suficientemente larga. Piensa en el problema del cumpleaños.

Hay una excelente respuesta de Dave Sherohman a otra pregunta sobre por qué debería usar sales generadas al azar en lugar del nombre de un usuario (u otros datos personales) Si sigues esas sugerencias, realmente no importa dónde pones la sal.

105
Georg Schölly

Creo que es todo semántica. Ponerlo antes o después no importa, excepto contra un modelo de amenaza muy específico.

Se supone que el hecho de que esté ahí para derrotar a las mesas Rainbow.

El modelo de amenaza al que aludí sería el escenario en el que el adversario puede tener tablas Rainbow de sales comunes adjuntas a la contraseña. (Diga la NSA) Usted está adivinando que lo tienen agregado o antepuesto pero no ambos. Eso es tonto, y es una mala suposición.

Sería mejor suponer que tienen la capacidad de almacenar estas tablas de Rainbow, pero no, digamos, tablas con sales extrañas intercaladas en medio de la contraseña. En ese caso estrecho, yo conjeturaría que lo mejor sería intercalar.

Como dije. Es semántica. Elija una sal diferente por contraseña, una sal larga, e incluya caracteres impares como símbolos y ASCII códigos: © ¤¡

25
Tom Ritter

La respuesta real, que nadie parece haber tocado, es que ambos están equivocados . Si está implementando su propio criptografía, no importa cuán trivial sea la parte que crea que está haciendo, usted va a cometer errores.

HMAC es un mejor enfoque, pero incluso si está usando algo como SHA-1, ya ha elegido un algoritmo que no es adecuado para el hashing de contraseñas debido a su diseño para la velocidad. Use algo como bcrypt o posiblemente scrypt y quite el problema de sus manos por completo.

Ah, y ni siquiera piense en comparar los hashes resultantes para igualar con su lenguaje de programación o las utilidades de comparación de cadenas de bases de datos. Aquellos comparan carácter por carácter y cortocircuito como false si un personaje difiere. Así que ahora los atacantes pueden usar métodos estadísticos para tratar de averiguar qué es el hash, un personaje a la vez.

18
Stephen Touset

No debería hacer ninguna diferencia. El hash no será más fácil de adivinar donde pones la sal. Las colisiones hash son raras e impredecibles, en virtud de ser intencionalmente no lineales. Si hubiera una diferencia en la seguridad, eso sugeriría un problema con el hash, no con la salazón.

9
Phil H

Si utiliza un hash criptográficamente seguro, no debería importar si realiza una corrección previa o posterior; Un punto de hash es que un solo cambio de bit en los datos de origen (sin importar dónde) debe producir un hash diferente.

Qué es Sin embargo, lo importante es usar sales largas, generarlas con un PRNG criptográfico adecuado y tener sales por usuario. El almacenamiento de las sales por usuario en su base de datos es no Un problema de seguridad, utilizando un hash en todo el sitio. es.

7
snemarch

En primer lugar, el término "tabla del arco iris" se usa de forma indebida. Una tabla "Rainbow" es solo un tipo de tabla de búsqueda, uno que permite un tipo particular de compresión de datos en las teclas. Al cambiar el cálculo por espacio, una tabla de búsqueda que tomaría 1000 TB puede comprimirse mil veces para que pueda almacenarse en una unidad de disco más pequeña.

Debería preocuparse por el hash a las tablas de búsqueda de contraseñas, Rainbow o de otro tipo.

@ onebyone.livejournal.com:

El atacante tiene "tablas de arco iris" que consisten no en el hash de las palabras del diccionario, sino en el estado del cálculo de hash justo antes de finalizar el cálculo de hash.

Entonces podría ser más económico forzar la entrada de un archivo de contraseña con sal de postfix que la sal de prefijo: para cada palabra del diccionario, a su vez, cargaría el estado, agregaría los bytes de sal al hash y luego lo finalizaría. Con la sal prefijada no habría nada en común entre los cálculos para cada palabra del diccionario.

Para una función hash simple que escanea linealmente a través de la cadena de entrada, como un simple generador lineal congruente, este es un ataque práctico. Pero una función hash criptográficamente segura está diseñada deliberadamente para tener múltiples rondas, cada una de las cuales utiliza todos los bits de la cadena de entrada, de modo que calcular el estado interno justo antes para agregar sal no sea significativo después de la primera ronda Por ejemplo, SHA-1 tiene 80 rondas.

Además, los algoritmos de hash de contraseñas como PBKDF componen su función de hash varias veces (se recomienda iterar el PBKDF-2 un mínimo de 1000 veces, cada iteración aplicando SHA-1 dos veces) haciendo que este ataque sea doblemente práctico.

5
cygil

BCrypt hash si la plataforma tiene un proveedor. Me encanta cómo no te preocupas por crear las sales y puedes hacerlas aún más fuertes si quieres.

4
Samuel

Insertar la sal un número arbitrario de caracteres en la contraseña es el caso menos esperado, y por lo tanto el más "seguro" socialmente, pero en realidad no es muy significativo en el caso general, siempre y cuando use una contraseña larga y única Cuerdas para sales.

2
jeffcook2150