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)));
}
encryption
usuario1477388
fuente
fuente
SHA256
es una función hash criptográfica , no un algoritmo de cifrado. Es una función unidireccional .Respuestas:
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
A
cuyo hash es el valorB
, es muy, muy difícil crear intencionalmente otro valorC
que también genere un hashB
.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 era0WrtCkg6IdaV/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.fuente
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).
fuente