salt - Contraseñas de salazón 101
password-hash (5)
¿Podría alguien ayudarme a entender cómo funciona la salazón?
Hasta ahora entiendo lo siguiente:
- Validar contraseña
- Generar una cadena aleatoria
- Hashea la contraseña y la cadena aleatoria y concátalas, luego guárdalas en el campo de contraseña ...
¿Cómo almacenamos la sal, o sabemos qué es cuando un usuario inicia sesión? ¿Lo almacenamos en su propio campo? Si no lo hacemos, ¿cómo determina la aplicación qué es la sal? Y si lo guardamos, ¿no se anula todo el propósito?
¿Cómo almacenamos la sal, o sabemos qué es cuando un usuario inicia sesión? ¿Lo almacenamos en su propio campo?
Sí.
Y si lo guardamos, ¿no se anula todo el propósito?
No. El propósito de una sal no es ser secreto, sino simplemente evitar que un atacante amortice el costo de la computación de tablas arcoiris en todos los sitios del mundo (no sal) o todos los usuarios en su sitio (sal única utilizada para todos los usuarios) .
De acuerdo con la Criptografía práctica (Neils Ferguson y Bruce Schneier), debe usar hashes estirados y salados para la máxima 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 que sea computacionalmente más difícil para un atacante probar muchas permutaciones de contraseñas. r
debe elegirse de modo que el cálculo tome aproximadamente 200-1000ms en la computadora del usuario. Puede ser necesario aumentar r
a medida que las computadoras se vuelven más rápidas.
Salt se combina con la contraseña antes del hashing. La contraseña y los valores de borrado de sal se concatenan y la cadena resultante está en hash. esto garantiza que incluso si dos personas tuvieran la misma contraseña, tendrías diferentes hashes resultantes. (También hace que los ataques conocidos como ataques de diccionario que usan tablas de arco iris sean mucho más difíciles).
La sal se almacena en formato original / claro junto con el resultado de hash. Luego, cuando desee verificar la contraseña, volverá a realizar el proceso original. Combine la sal del registro con la contraseña que proporcionó el usuario, haga un hash del resultado, compare el hash.
Probablemente ya lo sabes. pero es importante recordar La sal debe ser generada al azar cada vez. Debe ser diferente para cada hash protegido. Muchas veces el RNG se utiliza para generar la sal.
Así por ejemplo:
contraseña de usuario: "mypassword"
sal aleatoria: "abcdefg12345"
result-cleartext: "mypassword: abcdefg12345" (la forma de combinarlas depende de usted, siempre que utilice el mismo formato de combinación cada vez).
hash el texto claro resultante: "somestandardlhashhashbasedonalgorithm"
En tu base de datos ahora almacenarías el hash y la sal que usaste. Lo he visto de dos maneras:
Método 1:
field1 - salt = "abcdefg12345"
field2 - password_hash = "somestandardlengthhash basededonalgorithm"
método 2:
field1 - password_hash = "abcdefg12345: somestandardlengthhashbasedonalgorithm"
En cualquier caso, debe cargar el hash de sal y contraseña de su base de datos y rehacer el hash para compararlos.
Si está utilizando un conocido algoritmo de hash, alguien podría tener una lista de muchas de las posibles contraseñas que ya se han utilizado con ese algoritmo y comparar los elementos de esa lista con una contraseña con hash que quieren descifrar (ataque del diccionario).
Si se "saltean" todas las contraseñas antes de incluirlas, estos diccionarios son inútiles, ya que tendrían que ser creados usando su sal.
salt <- random
hash <- hash(password + salt)
store hash:salt
Luego
input password
look up hash:salt
hash(password+salt)
compare with stored hash
¿Lo tengo?