- Visión general de los métodos de transformación de la información disponibles
- Cifrado, hashing y empaquetado de datos: CryptEncode
- Descifrado y descompresión de datos: CryptDecode
Visión general de los métodos de transformación de la información disponibles
La protección de la información puede aplicarse con distintos fines y, por tanto, utilizar distintos métodos. En concreto, puede ser necesario ocultar por completo la esencia de la información a un observador externo o asegurar su transmisión, garantizando al mismo tiempo un estado inalterado, pero la información en sí sigue estando disponible. En el primer caso, hablamos de cifrado, y el segundo se refiere a una huella digital (hash). Así, el cifrado y el hashing se reducen a procesar los datos originales en una nueva representación utilizando, si es necesario, parámetros adicionales.
Tanto el cifrado como el hashing tienen muchas variantes.
La gradación más general divide el cifrado en cifrado de clave pública (asimétrico) y cifrado de clave privada (simétrico).
Un esquema asimétrico implica la presencia de 2 claves -pública y privada- para cada participante en el intercambio de datos. Los pares de claves pública y privada se generan previamente mediante algoritmos especiales. Cada clave privada sólo es conocida por su propietario. Las claves públicas de todo el mundo son conocidas por todos. Las claves públicas deberán intercambiarse de un modo u otro antes de poder transmitir los datos cifrados. A continuación, el proveedor de datos utiliza su clave privada, que sólo él conoce, junto con una o varias claves públicas de los destinatarios de los datos. Éstos, a su vez, utilizan sus claves privadas y la clave pública del remitente para descifrar.
Un esquema de cifrado simétrico utiliza la misma clave secreta (privada) tanto para cifrar como para descifrar.
MQL5 admite la función de clave privada lista para usar (simétrica). Las herramientas MQL5 integradas no proporcionan una firma electrónica que utilice cifrado asimétrico.
Entre los métodos de cifrado destacan los algoritmos primitivos sin clave. Con su ayuda, los usuarios logran la ocultación condicional de información o la transformación del tipo de información. Entre ellos se encuentran, por ejemplo, ROT13 (sustitución de caracteres con un desplazamiento de sus códigos alfanuméricos por 13, utilizado, en particular, en el registro de Windows) o Base64 (traducción de archivos binarios a texto y viceversa, normalmente en proyectos web). Otra tarea popular de transformación de datos es la compresión de datos. En cierto sentido, también se puede considerar como una encriptación, ya que los datos se vuelven ilegibles para un humano o un programa de aplicación.
También se ofrecen muchos métodos de hashing, y CRC (Cyclic Redundancy Check) es quizás el más famoso y sencillo. A diferencia del cifrado, que permite recuperar el mensaje original a partir del cifrado, el hashing sólo crea una huella digital (un conjunto característico de bytes) basada en la información original, de tal forma que su estado inalterado mientras se recalcula posteriormente garantiza (con una alta probabilidad) la invariabilidad de la información original. Por supuesto, esto supone que la información está disponible para todos los participantes/usuarios del sistema de software correspondiente. Es imposible recuperar información mediante hash. Por regla general, el tamaño del hash (el número de bytes que contiene) está limitado y estandarizado para cada método, de modo que para una cadena de 80 caracteres de longitud y para un archivo de 1 MB obtendremos un hash del mismo tamaño. Una aplicación de hashing que la mayoría de los usuarios encontrará realmente útil es el hashing de contraseñas de sitios y programas, es decir, estas últimas se almacenan en casa y se verifican durante el inicio de sesión con el hash de la contraseña, y no con la contraseña en su forma original.
Hay que señalar que ya nos encontramos con el término «hash» en el capítulo anterior: utilizamos una función de hashing para indexar estructuras de calendario económico. Ese hash simple tiene un grado de protección muy débil, que, en concreto, se expresa en una alta probabilidad de colisiones (coincidencia de resultados para datos diferentes), que procesamos especialmente en el algoritmo. Es adecuado para problemas de distribución pseudoaleatoria uniforme de datos en un número limitado de «cestas». En cambio, los estándares industriales de hashing se centran específicamente en verificar la integridad de la información y utilizan métodos de cálculo mucho más complejos. Pero la longitud del hash en este caso es de varias decenas de bytes y no de un solo número.
Los métodos de cifrado y hashing de información disponibles para los programas MQL se recopilan en la enumeración ENUM_CRYPT_METHOD.
Constante |
Descripción |
---|---|
CRYPT_BASE64 |
Recodificación Base64 |
CRYPT_DES |
Cifrado DES con una clave de 56 bits (7 bytes) |
CRYPT_AES128 |
Cifrado AES con una clave de 128 bits (16 bytes) |
CRYPT_AES256 |
Cifrado AES con una clave de 256 bits (32 bytes) |
CRYPT_HASH_MD5 |
Cálculo hash MD5 (16 bytes) |
CRYPT_HASH_SHA1 |
Cálculo hash SHA1 (20 bytes) |
CRYPT_HASH_SHA256 |
Cálculo hash SHA256 (32 bytes) |
CRYPT_ARCH_ZIP |
Compresión mediante el método «deflate» |
La enumeración especificada se utiliza en las dos funciones criptográficas de la API - CryptEncode (cifrado/hashing) y CryptDecode (descifrado). Se analizarán en las secciones siguientes.
Los métodos de cifrado AES y DES requieren, además de los datos, la clave de cifrado: un array de bytes de una longitud predefinida (se indica entre paréntesis en la tabla). Como ya se ha mencionado, la clave debe mantenerse en secreto y sólo debe conocerla el desarrollador del programa o el propietario de la información. La fuerza criptográfica del cifrado, es decir, la dificultad de seleccionar una clave por parte del ordenador de un atacante, depende directamente del tamaño de la clave: cuanto más grande sea, más fiable será la protección. Por lo tanto, DES se considera obsoleto y ha sido sustituido en el sector financiero por su versión mejorada de Triple DES: implica la aplicación sucesiva de DES tres veces con tres claves diferentes, lo cual es fácil de implementar en MQL5. Existe una versión popular de Triple DES, que realiza el descifrado en la segunda iteración en lugar del cifrado con la clave número 2, es decir, restaura, digamos, los datos a una representación intermedia, deliberadamente incorrecta, antes de la tercera ronda final de DES. Pero también está previsto que Triple DES desaparezca de los estándares del sector después de 2024.
Al mismo tiempo, la fuerza criptográfica debe ser proporcional a la duración del secreto (clave e información). Si se requiere un flujo rápido de mensajes seguros, las claves más cortas que se actualizan regularmente proporcionarán un mejor rendimiento.
De los métodos de hashing, el más moderno es SHA256 (un subconjunto del estándar SHA-2). Los métodos SHA1 y MD5 se consideran inseguros, pero siguen utilizándose ampliamente para ser compatibles con los servicios existentes. Para los métodos de hashing se indica entre paréntesis el tamaño del array de bytes resultante con una huella digital de los datos. No se necesita una clave para el hashing, pero en muchas aplicaciones, la «sal» se adjunta a los datos hasheados: un componente secreto que dificulta a los atacantes la reproducción de los hashes requeridos (por ejemplo, a la hora de adivinar una contraseña).
El elemento CRYPT_ARCH_ZIP permite el archivo ZIP y la transmisión/recepción de solicitudes de datos en Internet (véase WebRequest).
A pesar de que el nombre del método incluye ZIP, los datos comprimidos no son equivalentes a los archivos ZIP habituales, que, además de los contenedores «deflate», siempre contienen metadatos: encabezados especiales, una lista de archivos y sus atributos. En el sitio mql5.com, en los artículos y en la biblioteca de código fuente, puede encontrar implementaciones listas para comprimir archivos en un archivo ZIP y extraerlos desde allí. La compresión y extracción se realizan mediante las funciones CryptEncode/CryptDecode, y todas las estructuras adicionales necesarias del formato ZIP se describen y rellenan en el código MQL5.
El método Base64 está diseñado para convertir datos binarios en texto y viceversa. Los datos binarios suelen contener muchos caracteres no imprimibles y no son compatibles con las herramientas de edición y entrada, como las variables de entrada en los cuadros de diálogo de propiedades del programa MQL. Base64 puede ser útil, por ejemplo, cuando se trabaja con el popular formato de texto de intercambio de datos de objetos JSON.
Cada 3 bytes originales se codifican en Base64 con 4 caracteres, lo que da lugar a un aumento del tamaño de los datos en un tercio. El libro se acompaña de archivos de prueba con los que experimentaremos en los siguientes ejemplos; en concreto, la página web MQL5/Files/MQL5Book/clock10.htm y el archivo utilizado en ella con la imagen del reloj MQL5/Files/MQL5Book/clock10.png. Ya en esta fase introductoria puede ver claramente las posibilidades y la diferencia en la representación interna de los datos binarios y el texto Base64, mientras que mantienen una apariencia idéntica.
Página web con imagen binaria incrustada y en formato Base64
La misma imagen con la esfera de un reloj se inserta en la página como archivo externo clock10.png, así como su codificación Base64 en la etiqueta img (en su atributo src: es la «URL de datos»). Directamente en el texto de la propia página web tiene este aspecto (no es necesario envolver una cadena larga Base64 en un ancho de 76 caracteres, pero está permitido por la norma y se hace aquí con fines de publicación):
<img src="data:image/png;base64,
|
Pronto reproduciremos esta secuencia de caracteres utilizando la función CryptEncode, pero por ahora, basta con señalar que, con una técnica similar, podemos generar informes HTML con gráficos incrustados desde MQL5.