encryption - traduccion - ¿Por qué usamos la "sal" para proteger nuestras contraseñas?
encryption unsuccessful (4)
Las tablas del arco iris son caras de calcular. Sin la sal, puede crear una tabla de arco iris una vez que se pueda usar repetidamente, ya que la contraseña "contraseña" siempre generará el mismo hash (md5 = 5f4dcc3b5aa765d61328deb882cf99) caja de cuna de un cúbito de la vajilla de la vajilla de la vajilla de los animales de compañía
Con una sal, debes calcular una tabla de arco iris para cada sal que encuentres. Una sal de buen tamaño, digamos 32 bits (idealmente, 128 o incluso más), significa que tiene que calcular una tabla de arco iris para cada contraseña que quiera descifrar, por lo tanto, en gran medida, anula su propósito.
Estaba leyendo este tutorial , y encontré la siguiente discusión sobre el cifrado. Al final hay escrito.
En la última línea, hemos eliminado el salt con la contraseña, dando como resultado una contraseña cifrada que es prácticamente imposible de descifrar
Pero en mi opinión, un pirata informático que tiene tanto la encrypted_password
como la salt
podría hacer el truco del "arco iris" exactamente como si estuviéramos usando la salt
.
Entonces, ¿dónde estoy equivocado?
¡Gracias!
$ rails console >> require ''digest'' >> def secure_hash(string) >> Digest::SHA2.hexdigest(string) >> end => nil >> password = "secret" => "secret" >> encrypted_password = secure_hash(password) => "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b" >> submitted_password = "secret" => "secret" >> encrypted_password == secure_hash(submitted_password) => true
Aquí hemos definido una función llamada secure_hash que usa una función de hash criptográfica llamada SHA2, parte de la familia SHA de funciones de hash, que incluimos en Ruby a través de la biblioteca de compendios.7 No es importante saber exactamente cómo funcionan estas funciones de hash; para nuestros propósitos, lo importante es que son unidireccionales: no hay una manera computacionalmente manejable de descubrir que
2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b es el hash SHA2 de la cadena "secreto".
Sin embargo, si lo piensas bien, todavía tenemos un problema: si un atacante alguna vez se hiciera con las contraseñas con hash, todavía tendría la oportunidad de descubrir los originales. Por ejemplo, podría adivinar que usamos SHA2, y así escribir un programa para comparar un hash dado con los valores de hash de las posibles contraseñas:
>> hash = "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b" >> secure_hash("secede") == hash => false >> secure_hash("second") == hash => false >> secure_hash("secret") == hash => true
Así que nuestro atacante tiene una coincidencia: malas noticias para cualquier usuario con contraseña "secreta". Esta técnica es conocida como un ataque de arco iris.
Para frustrar un potencial ataque de arco iris, podemos usar una sal, que es una cadena única diferente para cada usuario.8 Una forma común de (casi) garantizar que la singularidad sea la función de hash de la hora actual (en UTC para ser independiente de la zona horaria) a lo largo con la contraseña, para que dos usuarios tengan la misma sal solo si se crean exactamente al mismo tiempo y tienen la misma contraseña. Veamos cómo funciona esto usando la función secure_hash definida en la consola anterior:
>> Time.now.utc => Fri Jan 29 18:11:27 UTC 2010 >> password = "secret" => "secret" >> salt = secure_hash("#{Time.now.utc}--#{password}") => "d1a3eb8c9aab32ec19cfda810d2ab351873b5dca4e16e7f57b3c1932113314c8" >> encrypted_password = secure_hash("#{salt}--#{password}") => "69a98a49b7fd103058639be84fb88c19c998c8ad3639cfc5deb458018561c847"
En la última línea, hemos eliminado el salt con la contraseña, dando como resultado una contraseña cifrada que es prácticamente imposible de descifrar . (Para mayor claridad, los argumentos para las funciones de hashing a menudo se separan con -.)
Sí, tienes razón, si alguien tuviera conocimiento de tu algoritmo y la sal, podría generar una tabla de arco iris. Sin embargo, generar una tabla de arco iris toma mucho tiempo, se permiten más caracteres.
Entonces, por ejemplo, si tiene una contraseña que consta de 10 caracteres, que son todos números, tiene 10 ^ 10 posibilidades. Si permite caracteres alfabéticos en mayúsculas y minúsculas, esto aumenta hasta 62 ^ 10 posibilidades, solo 8,39 * 10 ^ 17 permutaciones; y eso es solo para contraseñas de 10 caracteres, también debe tener en cuenta cualquier longitud por debajo y por encima, según la longitud de la contraseña que permita.
Se necesita mucho tiempo para generar una tabla de este tipo, mientras que las tablas arco iris para el algoritmo en sí pueden estar fácilmente disponibles, la sal modifica el algoritmo para hacerlo suyo, y la posibilidad de que exista una tabla es muy baja.
Salt es evitar que alguien realice un cálculo previo de una tabla de búsqueda "inversa" que permite a un atacante encontrar rápidamente una contraseña que dé como resultado el hash de destino. Crear una de estas tablas es tanto trabajo, computacionalmente, como forzar el espacio de la contraseña de destino, por lo que solo vale la pena si puede usar la tabla en muchos destinos.
La sal previene esto; el atacante debería tener en cuenta la sal cuando generó la tabla, por lo que la tabla sería buena para un solo objetivo, y el atacante ha vuelto a la fuerza bruta.
Si usa sal (incluso si es público pero exclusivo de un sitio) obtendrá una protección contra los hash-diccionarios, donde las contraseñas de uso frecuente ya están encriptadas.
Si su sal es segura, entonces no pueden forzarla bruscamente usando supercomputadoras. Tienen que verificar todas las contraseñas posibles con su servidor (lo que esperamos tenga alguna forma de protección de fuerza bruta).