Veo mucha confusión entre algoritmos de cifrado y hash y me gustaría escuchar más consejos de expertos sobre:
Cuándo usar hashes vs encriptaciones
Qué hace que un algoritmo hash o de encriptación sea diferente (desde un nivel teórico / matemático), es decir, qué hace que los hash sean irreversibles (sin la ayuda de un árbol del arco iris)
Aquí hay algunas preguntas SO similares que no entraron en tantos detalles como estaba buscando:
¿Cuál es la diferencia entre Ofuscación, Hashing y Cifrado?
Diferencia entre cifrado y hashing
security
encryption
hash
cryptography
Kenny Cason
fuente
fuente
Respuestas:
Bueno, puedes buscarlo en Wikipedia ... Pero como quieres una explicación, haré lo mejor que pueda aquí:
Funciones hash
Proporcionan un mapeo entre una entrada de longitud arbitraria y una salida (generalmente) de longitud fija (o longitud más pequeña). Puede ser desde un simple crc32, hasta una función hash criptográfica completa como MD5 o SHA1 / 2/256/512. El punto es que hay un mapeo unidireccional en curso. Siempre es un mapeo de muchos: 1 (lo que significa que siempre habrá colisiones) ya que cada función produce una salida más pequeña de la que es capaz de ingresar (si alimenta todos los archivos de 1mb posibles en MD5, obtendrá una tonelada de colisiones).
La razón por la que son difíciles (o imposibles en la práctica) es revertir debido a cómo funcionan internamente. La mayoría de las funciones hash criptográficas iteran sobre el conjunto de entrada muchas veces para producir la salida. Entonces, si observamos cada porción de entrada de longitud fija (que depende del algoritmo), la función hash llamará a eso el estado actual. Luego iterará sobre el estado y lo cambiará a uno nuevo y lo usará como retroalimentación en sí mismo (MD5 hace esto 64 veces por cada fragmento de datos de 512 bits). Luego, de alguna manera, combina los estados resultantes de todas estas iteraciones para formar el hash resultante.
Ahora, si quisiera decodificar el hash, primero tendría que descubrir cómo dividir el hash dado en sus estados iterados (1 posibilidad para entradas más pequeñas que el tamaño de un fragmento de datos, muchas para entradas más grandes). Entonces necesitarías invertir la iteración para cada estado. Ahora, para explicar por qué esto es muy difícil, imagínese tratando de deducir
a
yb
de la siguiente fórmula:10 = a + b
. Hay 10 combinaciones positivas dea
yb
que pueden funcionar. Ahora repite eso un montón de veces:tmp = a + b; a = b; b = tmp
. Para 64 iteraciones, tendría más de 10 ^ 64 posibilidades para probar. Y eso es solo una simple adición donde se conserva cierto estado de iteración a iteración. Las funciones hash reales realizan más de 1 operación (MD5 realiza aproximadamente 15 operaciones en 4 variables de estado). Y dado que la siguiente iteración depende del estado de la anterior y la anterior se destruye al crear el estado actual, es casi imposible determinar el estado de entrada que condujo a un estado de salida dado (para cada iteración no menos). Combine eso, con la gran cantidad de posibilidades involucradas, y decodificar incluso un MD5 tomará una cantidad de recursos casi infinita (pero no infinita). Tantos recursos que 'Funciones de cifrado
Proporcionan un mapeo 1: 1 entre una entrada y salida de longitud arbitraria. Y siempre son reversibles. Lo importante a tener en cuenta es que es reversible utilizando algún método. Y siempre es 1: 1 para una clave determinada. Ahora, hay múltiples entradas: pares de claves que pueden generar la misma salida (de hecho, generalmente las hay, dependiendo de la función de cifrado). Los buenos datos cifrados no se pueden distinguir del ruido aleatorio. Esto es diferente de una buena salida de hash que siempre tiene un formato consistente.
Casos de uso
Use una función hash cuando desee comparar un valor pero no pueda almacenar la representación simple (por cualquier número de razones). Las contraseñas deben ajustarse muy bien a este caso de uso, ya que no desea almacenarlas en texto sin formato por razones de seguridad (y no debería). Pero, ¿qué pasaría si quisieras verificar un sistema de archivos para archivos de música pirateados? No sería práctico almacenar 3 mb por archivo de música. Entonces, en su lugar, tome el hash del archivo y guárdelo (md5 almacenaría 16 bytes en lugar de 3mb). De esa manera, simplemente hash cada archivo y se compara con la base de datos almacenada de hashes (esto no funciona tan bien en la práctica debido a la nueva codificación, el cambio de encabezados de archivos, etc., pero es un caso de uso de ejemplo).
Use una función hash cuando verifique la validez de los datos de entrada. Para eso están diseñados. Si tiene 2 entradas, y desea verificar si son iguales, ejecute ambas a través de una función hash. La probabilidad de una colisión es astronómicamente baja para tamaños de entrada pequeños (suponiendo una buena función hash). Por eso se recomienda para contraseñas. Para contraseñas de hasta 32 caracteres, md5 tiene 4 veces el espacio de salida. SHA1 tiene 6 veces el espacio de salida (aproximadamente). SHA512 tiene aproximadamente 16 veces el espacio de salida. En realidad, no importa lo que la contraseña era , te importa si es la misma que la que se almacenó. Es por eso que debes usar hashes para contraseñas.
Utilice el cifrado siempre que necesite recuperar los datos de entrada. Note la palabra necesidad . Si está almacenando números de tarjetas de crédito, debe recuperarlos en algún momento, pero no desea almacenarlos en texto sin formato. Por lo tanto, almacene la versión encriptada y mantenga la clave lo más segura posible.
Las funciones de hash también son excelentes para firmar datos. Por ejemplo, si está utilizando HMAC, firma un dato tomando un hash de los datos concatenados con un valor conocido pero no transmitido (un valor secreto). Por lo tanto, envía el texto sin formato y el hash HMAC. Luego, el receptor simplemente mezcla los datos enviados con el valor conocido y verifica si coincide con el HMAC transmitido. Si es lo mismo, sabes que no fue manipulado por una parte sin el valor secreto. Esto se usa comúnmente en sistemas de cookies seguros por marcos HTTP, así como en la transmisión de mensajes de datos a través de HTTP, donde se desea garantizar la integridad de los datos.
Una nota sobre hashes para contraseñas:
Una característica clave de las funciones criptográficas de hash es que deben ser muy rápidas de crear y muy difíciles / lentas de revertir (tanto que es prácticamente imposible). Esto plantea un problema con las contraseñas. Si almacena
sha512(password)
, no está haciendo nada para protegerse contra las mesas de arco iris o los ataques de fuerza bruta. Recuerde, la función hash fue diseñada para la velocidad. Por lo tanto, es trivial para un atacante simplemente ejecutar un diccionario a través de la función hash y probar cada resultado.Agregar una sal ayuda a las cosas, ya que agrega un poco de datos desconocidos al hash. Entonces, en lugar de encontrar algo que coincida
md5(foo)
, necesitan encontrar algo que cuando se agrega a la sal conocida producemd5(foo.salt)
(que es mucho más difícil de hacer). Pero todavía no resuelve el problema de la velocidad, ya que si conocen la sal es solo cuestión de ejecutar el diccionario.Entonces, hay formas de lidiar con esto. Un método popular se llama fortalecimiento clave (o estiramiento clave). Básicamente, iteras sobre un hash muchas veces (usualmente miles). Esto hace dos cosas. Primero, ralentiza significativamente el tiempo de ejecución del algoritmo de hashing. En segundo lugar, si se implementa correctamente (pasando de nuevo la entrada y la sal en cada iteración) en realidad aumenta la entropía (espacio disponible) para la salida, reduciendo las posibilidades de colisiones. Una implementación trivial es:
Hay otras implementaciones, más estándar, como PBKDF2 , Bcrypt . Pero esta técnica es utilizada por varios sistemas relacionados con la seguridad (como PGP, WPA, Apache y OpenSSL).
El resultado final
hash(password)
no es lo suficientemente bueno.hash(password + salt)
es mejor, pero aún no es lo suficientemente bueno ... Use un mecanismo de hash extendido para producir los hashes de su contraseña ...Otra nota sobre estiramiento trivial
Bajo ninguna circunstancia alimente la salida de un hash directamente a la función hash :
La razón de esto tiene que ver con las colisiones. Recuerde que todas las funciones hash tienen colisiones porque el espacio de salida posible (el número de salidas posibles) es menor que el espacio de entrada. Para ver por qué, veamos qué sucede. Para comenzar, supongamos que hay una probabilidad de colisión del 0.001%
sha1()
(es mucho menor en realidad, pero con fines de demostración).Ahora,
hash1
tiene una probabilidad de colisión de 0.001%. Pero cuando hacemos lo siguientehash2 = sha1(hash1);
, todas las colisioneshash1
se convierten automáticamente en colisiones dehash2
. Entonces, ahora tenemos la tasa de hash1 en 0.001%, y la segundasha1()
llamada se suma a eso. Entonces ahora,hash2
tiene una probabilidad de colisión de 0.002%. ¡Eso es el doble de posibilidades! Cada iteración agregará otra0.001%
posibilidad de colisión al resultado. Entonces, con 1000 iteraciones, la posibilidad de colisión aumentó de un trivial 0.001% a 1%. Ahora, la degradación es lineal, y las probabilidades reales son mucho más pequeñas, pero el efecto es el mismo (una estimación de la posibilidad de una sola colisiónmd5
es aproximadamente 1 / (2 128 ) o 1 / (3x10 38) Si bien eso parece pequeño, gracias al ataque de cumpleaños no es realmente tan pequeño como parece).En cambio, al volver a agregar la sal y la contraseña cada vez, está reintroduciendo los datos nuevamente en la función hash. Por lo tanto, cualquier colisión de una ronda en particular ya no es una colisión de la siguiente ronda. Entonces:
Tiene la misma posibilidad de colisión que la
sha512
función nativa . Que es lo que quieres. Use eso en su lugar.fuente
Una función hash podría considerarse lo mismo que hornear una barra de pan. Empiezas con insumos (harina, agua, levadura, etc.) y luego de aplicar la función hash (mezclar + hornear), terminas con una salida: una barra de pan.
Ir hacia el otro lado es extraordinariamente difícil: realmente no se puede volver a separar el pan en harina, agua, levadura; parte de eso se perdió durante el proceso de horneado, y nunca se puede saber exactamente cuánta agua, harina o levadura se usó para un pan en particular, porque esa información fue destruida por la función de hashing (también conocido como el horno).
Teóricamente, muchas variantes diferentes de insumos producirán panes idénticos (por ejemplo, 2 tazas de agua y 1 cucharadita de levadura producen exactamente el mismo pan que 2.1 tazas de agua y 0.9 cucharaditas de levadura), pero dado uno de esos panes, no se puede decir exactamente qué combo de entradas lo produjo.
El cifrado, por otro lado, podría verse como una caja de seguridad. Todo lo que pones allí vuelve a salir, siempre que poseas la llave con la que estaba encerrado en primer lugar. Es una operación simétrica. Dada una clave y alguna entrada, obtienes una cierta salida. Dado ese resultado, y la misma clave, obtendrá la entrada original. Es un mapeo 1: 1.
fuente
Use hashes cuando no desee poder recuperar la entrada original, use cifrado cuando lo haga.
Los hashes toman alguna entrada y la convierten en algunos bits (generalmente considerados como un número, como un entero de 32 bits, un entero de 64 bits, etc.). La misma entrada siempre producirá el mismo hash, pero PRINCIPALMENTE pierde información en el proceso, por lo que no puede reproducir de manera confiable la entrada original (sin embargo, hay algunas advertencias).
El cifrado conserva principalmente toda la información que ingresa en la función de cifrado, pero hace que sea difícil (idealmente imposible) que cualquier persona vuelva a la entrada original sin poseer una clave específica.
Ejemplo simple de hashing
Aquí hay un ejemplo trivial para ayudarlo a comprender por qué el hashing no puede (en el caso general) recuperar la entrada original. Digamos que estoy creando un hash de 1 bit. Mi función hash toma una cadena de bits como entrada y establece el hash en 1 si hay un número par de bits establecidos en la cadena de entrada, de lo contrario 0 si había un número impar.
Ejemplo:
Tenga en cuenta que hay muchos valores de entrada que dan como resultado un hash de 0, y muchos que dan como resultado un hash de 1. Si sabe que el hash es 0, no puede saber con seguridad cuál fue la entrada original.
Por cierto, este hash de 1 bit no está ideado exactamente ... eche un vistazo al bit de paridad .
Ejemplo simple de cifrado
Puede encriptar texto usando una simple sustitución de letras, digamos que si la entrada es A, usted escribe B. Si la entrada es B, escribe C. Hasta el final del alfabeto, donde si la entrada es Z, usted escribe A de nuevo.
Al igual que el ejemplo simple de hash, este tipo de cifrado se ha utilizado históricamente .
fuente
Descripción general básica de las técnicas de cifrado y descifrado son.
ACTUALIZACIÓN: Para abordar los puntos mencionados en la pregunta editada.
fuente
Mi única frase ... en general, el entrevistador quería la siguiente respuesta.
Hashing es unidireccional. No puede convertir sus datos / cadena de un código hash.
El cifrado es de 2 vías: puede descifrar nuevamente la cadena cifrada si tiene la clave con usted.
fuente
Una función Hash convierte una cantidad de texto de tamaño variable en un texto de tamaño fijo.
Fuente: https://en.wikipedia.org/wiki/Hash_function
Funciones hash en PHP
Un hash convierte una cadena en una cadena hash. Vea abajo.
PICADILLO:
Las contraseñas generalmente se almacenan en su representación hash en lugar de texto legible. Cuando un usuario final desea obtener acceso a una aplicación protegida con una contraseña, se debe proporcionar una contraseña durante la autenticación. Cuando el usuario envía su contraseña, el sistema de autenticación válido recibe la contraseña y agrega la contraseña. Este hash de contraseña se compara con el hash conocido por el sistema. Se concede acceso en caso de igualdad.
DESHECHO:
SHA1 es un hash unidireccional. Lo que significa que no puedes eliminar el hash.
Sin embargo, puedes aplicar fuerza bruta al hash. Consulte: https://hashkiller.co.uk/sha1-decrypter.aspx .
MD5, es otro hash. Se puede encontrar un dehasher MD5 en este sitio web: https://www.md5online.org/ .
Para obstaculizar los ataques de fuerza bruta sobre los hashes, se puede dar una sal. En php puedes usar
password_hash()
para crear un hash de contraseña. La funciónpassword_hash()
crea automáticamente una sal. Para verificar una contraseña en un hash de contraseña (con sal) usepassword_verify()
.Una contraseña puede ser representada por más de un hash. Cuando verifica la contraseña con diferentes valores hash de contraseña utilizando
password_verify()
, la contraseña se aceptará como una contraseña válida.Una función de cifrado transforma un texto en un texto cifrado sin sentido mediante el uso de una clave de cifrado, y viceversa.
Fuente: https://en.wikipedia.org/wiki/Encryption
Cifrado en PHP
Vamos a sumergirnos en un código PHP que maneja el cifrado.
--- La extensión de Mcrypt ---
ENCRIPTACIÓN:
Descifrar:
--- La extensión de OpenSSL ---
La extensión de Mcrypt quedó en desuso en 7.1. y eliminado en php 7.2. La extensión OpenSSL debe usarse en php 7. Consulte los fragmentos de código a continuación:
fuente
A_KEY
es una clave AES / Rijndael-128; es una contraseña, no un ke aliado.Cifrado simétrico:
El cifrado simétrico también puede denominarse clave compartida o cifrado secreto compartido. En el cifrado simétrico, se usa una sola clave para cifrar y descifrar el tráfico.
Cifrado asimétrico:
El cifrado asimétrico también se conoce como criptografía de clave pública. El cifrado asimétrico difiere del cifrado simétrico principalmente en que se usan dos claves: una para el cifrado y otra para el descifrado. El algoritmo de cifrado asimétrico más común es
RSA
.En comparación con el cifrado simétrico, el cifrado asimétrico impone una alta carga computacional y tiende a ser mucho más lento. Por lo tanto, generalmente no se emplea para proteger los datos de carga útil. En cambio, su mayor fortaleza es su capacidad para establecer un canal seguro a través de un medio no seguro (por ejemplo, Internet). Esto se logra mediante el intercambio de claves públicas, que solo se pueden usar para cifrar datos. La clave privada complementaria, que nunca se comparte, se utiliza para descifrar.
Hashing:
Finalmente, el hashing es una forma de seguridad criptográfica que difiere del cifrado. Mientras que el cifrado es un proceso de dos pasos utilizado para cifrar primero y luego descifrar un mensaje, el hash condensa un mensaje en un valor irreversible de longitud fija o hash. Dos de los algoritmos de hashing más comunes vistos en redes son
MD5
ySHA-1
.Lea más aquí: http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/
fuente
Use hashes cuando solo necesite ir en una dirección. Por ejemplo, para las contraseñas en un sistema, usa hashing porque solo verificará que el valor ingresado por un usuario, después del hash, coincida con el valor en su repositorio. Con el cifrado, puede ir de dos maneras.
Los algoritmos de hashing y los algoritmos de cifrado son solo algoritmos matemáticos. Entonces, a ese respecto, no son diferentes: son solo fórmulas matemáticas. Sin embargo, en cuanto a la semántica, existe una gran distinción entre el hash (unidireccional) y el cifrado (bidireccional). ¿Por qué los hashes son irreversibles? Porque están diseñados para ser así, porque a veces quieres una operación unidireccional.
fuente
Los algoritmos de cifrado y hash funcionan de manera similar. En cada caso, existe la necesidad de crear confusión y difusión entre los bits. En resumen, la confusión está creando una relación compleja entre la clave y el texto cifrado, y la difusión está difundiendo la información de cada bit.
Muchas funciones hash realmente utilizan algoritmos de encriptación (o primitivas de algoritmos de cifrado. Por ejemplo, el candidato SHA-3 madeja utiliza Threefish como el método subyacente para procesar cada bloque. La diferencia es que en lugar de mantener cada bloque de texto cifrado, son destructivamente, deterministamente fusionada a una longitud fija
fuente
cuando se trata de seguridad para la transmisión de datos, es decir, comunicación bidireccional, utiliza cifrado. Todo cifrado requiere una clave
cuando se trata de autorización, utiliza hashing. No hay clave en el hashing
El hash toma cualquier cantidad de datos (binario o texto) y crea un hash de longitud constante que representa una suma de verificación para los datos. Por ejemplo, el hash puede ser de 16 bytes. Diferentes algoritmos de hash producen hashes de diferentes tamaños. Obviamente, no puede volver a crear los datos originales del hash, pero puede volver a hacer hash para ver si se genera el mismo valor de hash. Las contraseñas unidireccionales basadas en Unix funcionan de esta manera. La contraseña se almacena como un valor hash, y para iniciar sesión en un sistema, la contraseña que escribe se escribe en hash y el valor hash se compara con el hash de la contraseña real. Si coinciden, entonces debe haber escrito la contraseña correcta
¿Por qué el hashing es irreversible?
El hash no es reversible porque la asignación de entrada a hash no es 1 a 1. Tener dos entradas asignadas al mismo valor hash generalmente se conoce como "colisión hash". Por razones de seguridad, una de las propiedades de una función hash "buena" es que las colisiones son raras en el uso práctico.
fuente
La criptografía trata con números y cadenas. Básicamente, todo lo digital en todo el universo son números. Cuando digo números, son 0 y 1. Sabes cuáles son, binarios. Las imágenes que ves en la pantalla, la música que escuchas a través de tus auriculares, todo son binarios. Pero nuestros oídos y ojos no entenderán los binarios, ¿verdad? Solo el cerebro podría entender eso, e incluso si pudiera entender los binarios, no puede disfrutarlos. Por lo tanto, convertimos los archivos binarios a formatos humanos comprensibles como mp3, jpg, etc. Califiquemos el proceso como Codificación . Es un proceso bidireccional y se puede decodificar fácilmente a su forma original.
Hashing
El hash es otra técnica de criptografía en la que los datos una vez convertidos a otra forma nunca pueden recuperarse. En el término de Layman, no existe un proceso llamado de-hashing . Hay muchas funciones hash para hacer el trabajo, como sha-512, md5, etc.
Si el valor original no se puede recuperar, ¿dónde lo usamos? Contraseñas Cuando configura una contraseña para su dispositivo móvil o PC, se crea un hash de su contraseña y se almacena en un lugar seguro. Cuando realice un intento de inicio de sesión la próxima vez, la cadena ingresada se vuelve a cifrar con el mismo algoritmo (función hash) y la salida se corresponde con el valor almacenado. Si es lo mismo, inicias sesión. De lo contrario, te expulsan.
Créditos: wikimedia Al aplicar hash a la contraseña, podemos asegurarnos de que un atacante nunca obtendrá nuestra contraseña, incluso si roba el archivo de contraseña almacenado. El atacante tendrá el hash de la contraseña. Probablemente pueda encontrar una lista de las contraseñas más utilizadas y aplicar sha-512 a cada una de ellas y compararla con el valor en su mano. Se llama ataque del diccionario . ¿Pero cuánto tiempo haría esto? Si su contraseña es lo suficientemente aleatoria, ¿cree que este método de descifrado funcionaría? Todas las contraseñas en las bases de datos de Facebook, Google y Amazon están en hash, o al menos se supone que están en hash.
Luego está el cifrado
El cifrado se encuentra entre el hash y la codificación. La codificación es un proceso bidireccional y no debe usarse para proporcionar seguridad. El cifrado también es un proceso bidireccional, pero los datos originales se pueden recuperar si y solo si se conoce la clave de cifrado. Si no sabe cómo funciona el cifrado, no se preocupe, discutiremos los conceptos básicos aquí. Eso sería suficiente para comprender los conceptos básicos de SSL. Por lo tanto, hay dos tipos de cifrado: cifrado simétrico y asimétrico.
Cifrado de clave simétrica
Estoy tratando de mantener las cosas tan simples como pude. Entonces, comprendamos el cifrado simétrico por medio de un algoritmo de cambio. Este algoritmo se usa para encriptar alfabetos cambiando las letras a izquierda o derecha. Tomemos una cadena CRYPTO y consideremos un número +3. Entonces, el formato encriptado de CRYPTO será FUBSWR. Eso significa que cada letra se desplaza a la derecha en 3 lugares. Aquí, la palabra CRYPTO se llama Texto sin formato , la salida FUBSWR se llama Texto cifrado , el valor +3 se llama Clave de cifrado (clave simétrica) y todo el proceso es un cifrado. Este es uno de los algoritmos de cifrado de clave simétrica más antiguos y básicos y su primer uso se informó durante la época de Julio César. Entonces, fue nombrado después de él y es el famoso Cifrado César . Cualquiera que conozca la clave de cifrado y pueda aplicar el reverso del algoritmo de César y recuperar el Texto sin formato original. Por lo tanto, se llama cifrado simétrico .
Cifrado de clave asimétrica
Sabemos que, en el cifrado simétrico, se usa la misma clave tanto para el cifrado como para el descifrado. Una vez que se roba esa clave, todos los datos desaparecen. Ese es un gran riesgo y necesitamos una técnica más compleja. En 1976, Whitfield Diffie y Martin Hellman publicaron por primera vez el concepto de cifrado asimétrico y el algoritmo se conocía como intercambio de claves Diffie-Hellman . Luego, en 1978, Ron Rivest, Adi Shamir y Leonard Adleman del MIT publicaron el algoritmo RSA . Estos pueden considerarse como la base de la criptografía asimétrica.
En comparación con el cifrado simétrico, en el cifrado asimétrico , habrá dos claves en lugar de una. Una se llama clave pública y la otra es la clave privada . Teóricamente, durante la iniciación podemos generar lo Público-Privadopar de llaves para nuestra máquina. La clave privada debe guardarse en un lugar seguro y nunca debe compartirse con nadie. La clave pública, como su nombre lo indica, se puede compartir con cualquiera que desee enviarle texto cifrado. Ahora, aquellos que tienen su clave pública pueden encriptar los datos secretos con ella. Si el par de claves se generó usando el algoritmo RSA, entonces deberían usar el mismo algoritmo mientras encriptan los datos. Por lo general, el algoritmo se especificará en la clave pública. Los datos cifrados solo se pueden descifrar con la clave privada que le pertenece.
Fuente: SSL / TLS para dummies parte 1: Ciphersuite, Hashing, Encryption | WST ( https://www.wst.space/ssl-part1-ciphersuite-hashing-encryption/ )
fuente
fuente