¿No se puede revertir el cifrado?

9

Tengo la impresión de que una cadena cifrada no se puede descifrar, por lo que el valor original se pierde para siempre.

Sin embargo, si la siguiente cadena siempre es igual a "dominic" (mi nombre), entonces no puede haber alguna forma lógica de revertirla; siendo que no es aleatorio ni se basa en la fecha / hora, pero ¿hay un método lógico?

0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=

No importa qué o cuántas veces cifre "dominic" (cadena), siempre es igual a lo anterior. Entonces, ¿no debería haber alguna forma de descifrar una cadena como esa?

Ejemplo de lo que estoy hablando:

public string EncryptPassword(string password)
{
    return Convert.ToBase64String(
        System.Security.Cryptography.SHA256.Create()
        .ComputeHash(Encoding.UTF8.GetBytes(password)));
}
usuario1477388
fuente
3
¿Estás hablando del hash criptográfico de un nombre (usado a menudo en contraseñas)? o el cifrado (que debe ser descifrado por una persona autorizada)?
11
SHA256es una función hash criptográfica , no un algoritmo de cifrado. Es una función unidireccional .
1
Descargo de responsabilidad obligatorio: salt the hash ( en.wikipedia.org/wiki/Salt_(cryptography) ). Además, SHA256 tiende a ser demasiado rápido para no tener problemas con los ataques de fuerza bruta utilizando, por ejemplo, GPU. Se recomienda usar algo como PBKDF2 o scrypt.
Maciej Piechotka
77
Hashing es como una picadora de carne. Puedes convertir una vaca en carne molida, pero no al revés.
Neil McGuigan
1
¿Está confundido por el cifrado de clave pública / privada? Si otra persona cifra un mensaje con su clave pública, no puede descifrar ese mensaje por sí mismo. Solo usted puede descifrar esto, y tal vez la NSA, el Mossad, el FSB y el Tiroler Geheimdienst.
ott--

Respuestas:

39

El cifrado siempre se puede revertir. El objetivo del cifrado es tomar un mensaje y codificarlo con una clave secreta para que solo otra persona que tenga la clave pueda revertir el cifrado y leer el mensaje.

Lo que estás viendo aquí es el hash , que no es lo mismo que el cifrado, aunque las técnicas criptográficas a menudo se usan para implementar hash. La idea de un hash es que utiliza técnicas matemáticas complicadas para construir un nuevo valor que se asigne a un valor antiguo, que es repetible. No hay clave, y no está destinada a revertirse. Se crea un hash criptográficamente fuerte con la propiedad matemática de que, si tiene un valor Acuyo hash es el valor B, es muy, muy difícil crear intencionalmente otro valor Cque también genere un hash B.

Los hashes no necesitan ser reversibles, porque se usan para la autenticación. Si me das un nombre de usuario y una contraseña, realmente no quieres que almacene esa contraseña en mi base de datos, porque si alguien piratea y obtiene acceso a mi base de datos, ¡podrían obtener tu contraseña! Entonces, en cambio, almacenaría el hash de su contraseña en la base de datos. Luego, cuando inicia sesión, verifico si hay un nombre de usuario que coincida con el suyo, con una entrada de contraseña que coincida con el hash de la contraseña que envió, y si es así, está autenticado, porque es muy difícil crear una colisión de hash ( dos valores que se combinan con el mismo valor) con un buen hash, por lo que estoy casi perfectamente seguro de que la contraseña que utilizó es la correcta.

La otra propiedad de un hash criptográfico fuerte es que es muy difícil de revertir. Sabes que el valor 0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=es el hash para "dominic" porque lo resolviste, pero si no sabías eso, y no sabías por dónde empezar a buscar, y todo lo que tenías era 0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=, literalmente podría llevarte miles de millones de años para descubrir que el original era "dominic", si el hash es bueno. Nuevamente, esto es útil para evitar daños colaterales en caso de que una lista de contraseñas sea robada.

Mason Wheeler
fuente
2
¿No podría simplemente tomar una lista de palabras conocidas y recorrerla hasta encontrar una coincidencia hash? ¿Es por eso que los sitios web sugieren agregar letras mayúsculas y números a sus contraseñas para que sean más seguras?
user1477388
15
@ user1477388: Sí, eso es exactamente por qué los sitios web sugieren eso. Esa es una forma bien conocida de atacar contraseñas hash: se llama "ataque de diccionario", por razones obvias, y usar palabras que no están en el diccionario es un paso importante para estar seguro contra ellas ...
Mason Wheeler
1
Parece que esto tiene una buena idea de mi "incapacidad para creer que esto no se puede revertir de alguna manera" security.stackexchange.com/questions/11717/... No es que quiera / tenga alguna necesidad de revertirlos; Tengo curiosidad.
user1477388
3
Otra sugerencia es agregar algo único a cada contraseña antes de que se convierta en hash. Una diferencia de contraseña de un carácter hace un hash completamente diferente, la idea es que todos sus resultados de hash serán únicos. De lo contrario, si un pirata informático descubre el hash de la palabra "contraseña123", sabrá usarlo contra TODOS los nombres de usuario con ese hash en particular. Sin embargo, parece que tienes una buena cabeza para este tipo de cosas, así que buena suerte.
Katana314
1
@MasonWheeler: el uso de palabras que no están en el diccionario no es realmente necesario, especialmente teniendo en cuenta que el "diccionario" utilizado en un ataque típico no se parece en nada al diccionario de Oxford, sino más bien a una lista de cadenas que se usan con frecuencia en las contraseñas . En lugar de tratar de evitar estas palabras, es mejor elegir, por ejemplo, 5 palabras aleatorias de una lista de aproximadamente 2000 palabras: una frase de contraseña de este tipo, incluso si se conoce el diccionario de 2000 palabras, toma casi 100 veces más tiempo en bruto. fuerza de 8 caracteres aleatorios de 64.
tdammers
9

Lo que está haciendo no es "cifrado", per se; es "hashing". La principal diferencia entre los dos es que el cifrado es fácilmente reversible (con la clave correcta, por supuesto), mientras que el hashing está diseñado para ser extremadamente difícil de revertir en cualquier circunstancia que no sea conocer el mensaje original en primer lugar.

En teoría, los hash simulan un "oráculo aleatorio", un homúnculo hipotético con una memoria eidética y una forma de generar números perfectamente únicos y perfectamente aleatorios sin límite de rango superior. Le darías un mensaje a este pequeño hombre, y una de dos cosas sucedería; o nunca ha visto el mensaje antes, en cuyo caso genera un nuevo número aleatorio y se lo da a usted como resumen, o ha visto ese mensaje antes, por lo que recuerda y le da el número que generó cuando lo vio primera vez. En ese modelo teórico, hay una relación cero entre un mensaje y su resumen, y sin un solo número que aparezca dos veces del RNG, no hay posibilidad de una colisión.

Desafortunadamente, no tenemos un oráculo aleatorio ideal; La idea tiene imposibilidades prácticas para una implementación digital, como la capacidad del oráculo para almacenar y recordar eficientemente cada mensaje que alguien haya descifrado en cualquier lugar, y la capacidad de los clientes de aceptar un número que podría ser cientos o miles de dígitos decimales. en longitud. En cambio, tenemos funciones hash, que son operaciones matemáticas irreversibles (unidireccionales) que funcionan en el mensaje mismo, para crear una transformación determinista (mismo mensaje => mismo hash) sin aparenterelación entre el hash y el mensaje original. Como se menciona en los comentarios, tampoco debería haber un cambio predecible en el valor hash producido al realizar cambios sistemáticos en el mensaje; idealmente, cada bit del resumen tendría un 50% de posibilidades de cambiar, dado un cambio en un solo bit del mensaje.

Hay muchos usos para una función hash; se usan para la verificación de desafío (piense en las credenciales de inicio de sesión como contraseñas) sin la necesidad de que ambas partes conozcan el secreto de texto sin formato, y se usan como sumas de verificación para verificar que un mensaje no haya sido manipulado o dañado. También se utilizan en los llamados escenarios de "prueba de trabajo"; tareas computacionales que son difíciles de completar pero fáciles de verificar.

Si alguna vez encontrara una manera de revertir eficientemente un resumen de hash SHA256 para producir un mensaje (cualquier mensaje) que resultaría en ese hash, sería una prueba demostrativa de que, de hecho, el hash está fundamentalmente roto. De hecho, se cree que SHA256 es seguro, lo que significa que no hay un método documentado, por práctico que sea, para comenzar con un resumen de hash y producir un mensaje de colisión que requiera menos trabajo que simplemente probar todas las posibilidades (lo que para SHA-256 es idealmente 2). ^ 256 ~ = 10 ^ 77 posibilidades).

KeithS
fuente
Vale la pena mencionar también que en una función hash ideal, un cambio de un bit en la entrada debería resultar en un cambio del 50% de los bits de salida. Se llama efecto avalancha .
un CVn
2
@ MichaelKjörling: Dicho de manera precisa, uno debería esperar que cada bit cambie con un 50% de probabilidad, que es diferente (pero implica) esperar que el 50% de los bits cambien, en promedio.
Dietrich Epp
@DietrichEpp De hecho, y el artículo de Wikipedia al que lo vinculé lo deja claro, pero es más fácil para el usuario final cuantificar el número de bits cambiados entre dos entradas.
un CVn