2010-08-25 18 views
14

¿Podría alguien ayudarme a entender cómo funciona la salazón?Contraseñas de salazón 101

Hasta ahora entiendo lo siguiente:

  1. Validar contraseña
  2. generar una cadena aleatoria
  3. hash de la contraseña y la cadena aleatoria y ConCat ellos, y luego almacenarlos en el campo de la contraseña ...

¿Cómo almacenamos la sal, o sabemos lo que es cuando un usuario inicia sesión? ¿Lo almacenamos en su propio campo? Si no lo hacemos, ¿cómo descubre la aplicación qué es la sal? Y si lo almacenamos, ¿no derrota todo el propósito?

+0

Encontré un mejor 'duplicado exacto': http://stackoverflow.com/questions/420843/ –

Respuesta

25

Sal se combina con la contraseña antes de hash. los valores de contraseña y claro sal se concatenan y la cadena resultante se procesa en hash. esto garantiza que incluso si dos personas tuvieran la misma contraseña, tendrías hashes resultantes diferentes. (también hace que los ataques conocidos como ataques de diccionario usando tablas de arco iris sean mucho más difíciles).

La sal se almacena en formato original/claro junto con el resultado hash. Luego, más adelante, cuando quiera verificar la contraseña, volverá a realizar el proceso original. Combina la sal del registro con la contraseña que el usuario proporcionó, hash el resultado, compara el hash.

Probablemente ya lo sepa. pero es importante recordar la sal debe generarse al azar cada vez. Debe ser diferente para cada hash protegido. Muchas veces el RNG se usa para generar la sal.

ejemplo So..for:
usuario-contraseña: "micontraseña"
sal al azar: "abcdefg12345"
resultante-texto claro: "mypassword: abcdefg12345" (¿cómo se combinan depende de usted siempre. ya que usa el mismo formato de combinación cada vez).
hash el texto claro resultante: "somestandardlengthhashbasedonalgorithm"

En su base de datos ahora puede almacenar el hash y la sal utilizados.Lo he visto dos maneras:

método 1:
campo1 - sal = "abcdefg12345"
campo2 - password_hash = "somestandardlengthhashbasedonalgorithm"

Método 2:
campo1 - password_hash = "abcdefg12345: somestandardlengthhashbasedonalgorithm "

En cualquiera de los casos tiene que cargar la sal y el hash de la contraseña de su base de datos y rehacer el hash para la comparación

+0

Gracias por la explicación completa. – Mohamad

11
salt <- random 
hash <- hash(password + salt) 
store hash:salt 

tarde

input password 
look up hash:salt 
hash(password+salt) 
compare with stored hash 

¡Gracias?

+3

El propósito de la salazón es vencer un ataque de diccionario. En lugar de crear un diccionario de contraseñas hash y simplemente buscar coincidencias por todos lados, obligas al atacante a volver a calcular todos los hashes para cada sal única. De esta manera, incluso se permite que la base de datos de contraseñas caiga en las manos equivocadas, y está bien porque el adversario tiene un problema computacionalmente inviable para resolver. – Ian

+0

Ian, ¿la sal tiene que ser picada también? – Mohamad

+2

@Mel: Dado que la sal generalmente es un montón de bits aleatorios, hashing no tiene sentido. – jpalecek

1

Si utiliza un algoritmo de hash conocido, alguien podría tener una lista de muchas contraseñas posibles ya procesadas usando ese algoritmo y comparar los elementos de esa lista con una contraseña hash que quieran descifrar (ataque del diccionario).
Si "saltea" todas las contraseñas antes de mezclarlas, estos diccionarios son inútiles, porque tendrían que crearse usando su sal.

3

¿Cómo almacenamos la sal, o sabemos lo que es cuando un usuario inicia sesión? ¿Lo almacenamos en su propio campo?

Sí.

Y si lo almacenamos, ¿no le cuesta todo?

No. El propósito de una sal no está siendo secreta, sino simplemente para evitar que un atacante amortizar el coste de calcular tablas de arco iris más de todos los sitios en el mundo (no salada) o todos los usuarios en su sitio (single sal utilizada para todos los usuarios).

2

De acuerdo con Cryptography práctico (Neils Ferguson y Bruce Schneier), debe usar hashes estirados y salados para mayor seguridad.

x[0] := 0 
x[i] := h(x[i-1] || p || s) for i = 1, ..., r 
K := x[r] 

where 
    h is the hash (SHA-1, SHA-256, etc.) 
    K is the generated hashed password 
    p is the plaintext password 
    r is the number of rounds 
    s is the randomly generated salt 
    || is the concatenation operator 

El valor de sal es un número aleatorio que se almacena con la contraseña cifrada. No necesita permanecer en secreto.

El estiramiento es el acto de realizar el hash varias veces para hacerlo computacionalmente más difícil para un atacante probar muchas permutaciones de contraseñas. r se debe elegir para que el cálculo tome alrededor de 200-1000ms en la computadora del usuario. r puede ser necesario aumentar a medida que las computadoras se vuelven más rápidas.

Cuestiones relacionadas