lunes, 12 de abril de 2021

Criptografía

Posted by q3it on lunes, abril 12, 2021 in ,
Hoy en día, la criptografía es esencial para casi todas las partes de la ciberseguridad. Traducido del griego como escritura oculta y tan antigua como los primeros mensajes que escribimos usando códigos o cifrados. Esto fue usado por Julio César para mantener las comunicaciones militares en privado. Su cifrado implicaba cambiar cada letra dejada por tres en el alfabeto. La idea básica aquí es que usamos algún tipo de algoritmo para codificar nuestros mensajes antes de enviarlos, para que parezcan un galimatías para cualquiera que pueda leerlos. Los únicos que pueden leer el mensaje son aquellos con los que compartimos el algoritmo, o aquellos que pueden descifrar el algoritmo. El cifrado César es, según los estándares modernos, muy fácil de romper.

Supongamos que Alice quiere enviar un mensaje a Bob. El problema es que vivimos en un mundo de redes no encriptadas. En Internet, siempre hay un tercero que maneja nuestras comunicaciones. Comunicarse a través de una red pública no encriptada significa que cualquiera en el camino del tráfico de Internet desde el punto A al punto B puede interceptar y leer los mensajes si lo desea. Es muy parecido a enviar un mensaje en una tarjeta postal por correo. Sabes que la persona del correo puede leerlo si quiere, cualquiera en el camión puede leerlo, o cualquiera en la instalación de procesamiento. Pero si Alice está enviando algo importante como su información bancaria, no quiere que todo el mundo pueda leerla. Así que la pregunta es, ¿hay alguna manera de que Alice envíe un mensaje a Bob a través de la misma red pública no encriptada, pero aún así asegurarse de que él es el único que puede leerlo? La hay, se llama criptografía de clave pública. Y así es como funciona. Para que Bob reciba mensajes encriptados, necesitará dos claves criptográficas relacionadas, una pública que pueda compartir con cualquiera que quiera enviarle un mensaje, y una privada que se guarda para sí mismo. Llamémoslas clave pública A y clave privada A, porque son un par coincidente, como una cerradura y una llave. Es un poco confuso llamar a ambas llaves porque la llave pública se usa un poco como una cerradura. 

La clave pública A se usa para encriptar o quizás bloquear mensajes y la clave privada A descifra los mensajes pero sólo si fueron encriptados con la clave pública A. La clave pública se llama así porque puede ser compartida abiertamente, por ejemplo, enviada a través de la red abierta a Alice. No puede desbloquear nada por sí misma. La clave pública A puede cifrar un mensaje pero no descifrar un mensaje que haya cifrado. Es decir, no puede desbloquear un mensaje que ha bloqueado. Así que no importa quién más en la red pueda tenerla. La clave privada A, por otro lado, debe mantenerse privada porque puede desencriptar o desbloquear mensajes codificados con la clave pública A. Por eso Bob tiene que mantenerla privada. Así que Alice toma su mensaje y la clave pública de Bob y aplica una función de encriptación, para que reciba un montón de lo que se llama texto cifrado, que parece un galimatías. Este texto cifrado puede ser enviado públicamente en la red abierta. Un tercero puede ver que Alice y Bob se están comunicando, pero no hay manera de saber lo que están diciendo. Y como Alice utilizó la clave pública A de Bob para cifrar el mensaje, la única clave correspondiente que puede descifrarlo es la clave privada A. Y como Bob es el único que la posee, Alice puede estar segura de que sólo él puede leer el mensaje. Piense en ello como un proceso matemático unidireccional, en el que, una vez que un mensaje se codifica con la clave pública de alguien, la única forma de leerlo es con la clave privada de esa persona. Y es casi imposible desencriptar o hackear el mensaje sin ella. 

Así que te preguntarás qué tiene que ver todo esto con la cadena de bloques. Bueno, la criptografía de clave pública es esencial para hacer que Blockchain sea seguro. Es la base de cómo funcionan los monederos digitales, cómo se comercializan los tokens y cómo se verifica la identidad. Aprenderemos más sobre esto en las próximas lecciones. La criptografía de clave pública es lo que se utiliza para crear registros históricos verificables de datos transaccionales. Es lo que hace posible que construyamos sistemas que son manejados por la comunidad global, sistemas que pueden ser verdaderamente descentralizados.

Funciones criptográficas de Hash

Las funciones de hash son quizás la cosa más importante que hay que entender si realmente quieres saber cómo funcionan las cadenas de bloques. Sabes lo que es una función si alguna vez has usado una hoja de cálculo y has hecho algo como =suma(5,7). Aquí, la suma es una función que toma una lista de entradas y las suma. La función de la función es sumar números. 

Las funciones de hash son las mismas, pero no dan una simple suma. Producen lo que se llama un hash, parece un texto aleatorio, pero no lo es. Una función de hash toma como entrada casi cualquier tipo de datos digitales; números, texto, imágenes, videos, e-books de cualquier tamaño. Y produce lo que parece una larga cadena de caracteres aleatorios. También se puede llamar un resumen, pero lo llamaremos hashes. Entonces, ¿cuál es el problema con eso? ¿Cómo es eso útil? Bueno, las propiedades de las funciones de hashes criptográficas les dan algunos usos muy interesantes. Por ejemplo, piensa en cuando te conectas a una aplicación o a un sitio web. Cuando introduces tu contraseña, se realiza una comparación entre bastidores para ver si la contraseña que has introducido coincide con la contraseña almacenada para tu cuenta. Pero tu contraseña no se almacena sólo en algún archivo de texto del servidor. Eso haría que fuera demasiado fácil de hackear. Si un intruso tuviera acceso al archivo de contraseñas, tendría todas las contraseñas de usuario de todo el sistema. Así que lo que puedes hacer aquí es usar una función de hash. En lugar de almacenar tu contraseña, se puede crear un hash de tu contraseña y almacenarla. Ahora, los detalles son un poco más complicados que esto. Pero es más o menos así, cuando vas a iniciar sesión, la contraseña que escribes se hace un hash con la misma función que se usó cuando la creaste originalmente. Y luego se comparan las dos. Tu contraseña real no está almacenada en ningún sitio. 

Ahora, podrías estar pensando, espera un minuto, ¿no podría alguien tomar la contraseña de hash y hacer ingeniería inversa de la función de hash para recuperar mi contraseña? La respuesta simple es no. De la misma manera que si supieras que 12 es el resultado final de la función de suma en una hoja de cálculo, no sabrías si sumé 7 y 5 o 4 y 8, y así sucesivamente. Excepto con las funciones de suma criptográficas, las matemáticas son mucho más complicadas. Pero una propiedad extremadamente importante de estas funciones de hash, que las hace tan útiles, es su irreversibilidad. Si los hackers consiguen obtener un archivo de contraseñas, la única manera de adivinar su contraseña es hacer lo que se llama un ataque de diccionario en el que hacen un hash de palabras, frases y variaciones comunes para ver si pueden encontrar coincidencias. Así que si tu contraseña es "dog", podrán encontrarla bastante rápido. Por eso, hoy en día, cuando creas contraseñas, se te pide que añadas letras, mayúsculas, números y símbolos.

Porque es mucho menos probable que los hackers piensen en hacer algo como dOg22%, lo que hace que tu contraseña sea más segura. Si tu contraseña es 1234, y la mía es 1235, los hashes son completamente diferentes, aunque nuestras contraseñas difieran por un solo carácter. No sólo los hashes son irreversibles, sino que incluso las entradas que son muy similares o cercanas entre sí terminan siendo completamente diferentes. Y mientras se siga escribiendo el hash sigue cambiando, porque la entrada de texto está cambiando. Y si cambio sólo una letra, se obtiene un hash totalmente diferente. Puedes pensar en un hash como una firma única de una entrada dada. 

Otra propiedad de estas funciones de hash es que las posibilidades de que una contraseña genere el mismo hash que otra, algo llamado colisión, son tan improbables que son, en la práctica, imposibles. También deberían ser rápidas, la función no debería necesitar mucha potencia de ordenador. Veamos otro ejemplo. Imagine que ha creado un documento legal y lo ha enviado para su revisión. Y se le envió de nuevo aprobado sin cambios. ¿Cómo puede saber que el documento no ha sido alterado de ninguna manera? Bueno, podrías leer cuidadosamente el documento línea por línea y asegurarte de que coincide con el original. O podrías tomar un resumen del documento original y compararlo con el del documento recibido. Debido a que la función de hash produce una huella digital única de sus datos de entrada, puede estar seguro de que si el documento fue alterado los hashes no coincidirían. Y que si los hashes coinciden, los documentos son idénticos. 

Las diferentes funciones de hash criptográficas tienen nombres diferentes, y a menudo tienen números asociados relacionados con la longitud de su salida. Una función de hash común es SHA-128, que significa el algoritmo de hash estándar. Y su salida tiene una longitud de 128 bits. La salida del SHA-256 tiene una longitud de 256 bits. Recordemos que los bits son los 1 y 0 binarios que componen cualquier cosa digital. Más bits generalmente significa más seguridad, porque hay menos posibilidades de tener una colisión donde las salidas de 2 entradas son las mismas. Si imaginas una función hash con sólo una salida de 2 bits, es decir, un número de 0 a 4, puedes ver que es muy fácil encontrar 2 entradas que den la misma salida. Definitivamente tendrás una coincidencia después de 4 entradas diferentes. Pero para una función de hash de 128 bits, tendrías esta cantidad de posibles salidas de hash diferentes. Así que una colisión es muy poco probable. Otra característica crucial de las funciones de hash es que son deterministas. Así que, para una función dada como la SHA-256, la misma entrada siempre dará la misma salida. Otra cosa que hay que tener en cuenta, la salida de una función de hashes es un número. Puede que veas letras ahí, pero eso es porque se trata de un número hexadecimal. 

Si nunca has visto un número hexadecimal antes, pueden parecer un poco extraños. Como saben, los números decimales, a los que estamos acostumbrados, contienen 10 símbolos diferentes en cada columna numérica. Así que mientras cuentas, dirías 5, 6, 7 y así sucesivamente. Los números hexadecimales, por otro lado, contienen 16 símbolos por cada columna numérica. Así que en lugar de detenernos en el 9 y retroceder hasta el 0, seguimos con A, B, C, D, E y F. Seguirías contando de la misma manera, pero tienes más números después del 9 para ir. Esto también se llama base 16, lo que significa que cada ranura de números tiene hasta 16 en lugar de 10. Lo que es importante recordar es que si ves algo así, debes saber que pueden representar un número hexadecimal. 

Así que para recapitular, una función de hash puede tomar una entrada digital de cualquier tamaño y producir de forma determinista e irreversible una huella digital pequeña, de longitud fija y única, que cambia dramáticamente incluso con un cambio mínimo en los datos de entrada. Y lo hace sin demasiados gastos de computación.