openssl, un recordatorio

Publicado 2023-05-11 by Jaime

A raíz de la publicación de OpenSSL Cookbook 3ed y de darme cuenta de que la gran mayoría de lo que pone en el libro no es relevante para mis necesidades decidí echar un vistazo a otras cosas en las que openssl sí puede ayudarme. Antes que nada:

$ openssl version
OpenSSL 1.1.1n  15 Mar 2022

Cifrado

Una de las cosas que permite el programa es un cifrado simétrico con o sin cifrado añadido en base64. Vamos a hacer pruebas con un fichero de ejemplo

$ cat fortuna.txt
El mucho saber hace sabios, pero no dichosos.

Veamos que algoritmos ofrece el programa:

$ openssl enc -list
Supported ciphers:
-aes-128-cbc               -aes-128-cfb               -aes-128-cfb1
-aes-128-cfb8              -aes-128-ctr               -aes-128-ecb

...

-camellia-128-cbc          -camellia-128-cfb          -camellia-128-cfb1
-camellia-128-cfb8         -camellia-128-ctr          -camellia-128-ecb
-camellia-128-ofb          -camellia-192-cbc          -camellia-192-cfb

...

-rc2-64-cbc                -rc2-cbc                   -rc2-cfb
-rc2-ecb                   -rc2-ofb                   -rc4
-rc4-40                    -seed                      -seed-cbc
-seed-cfb                  -seed-ecb                  -seed-ofb
-sm4                       -sm4-cbc                   -sm4-cfb
-sm4-ctr                   -sm4-ecb                   -sm4-ofb

Huh, si no cuento mal son 141 algoritmos. ¿Cuales son las recomendaciones actualmente? AES sigue siendo el estándar con razón, Blowfish empieza a tener unos años y su sucesor Twofish no aparece en la lista. Camellia es uno de los más seguros, la elección internacional por la organización ISO y el foro IETF.

Vamos a usar Camellia, para ello vamos a empezar por generar una clave pseudoaleatoria de 256 bits usando el mismo programa.

openssl rand -out clave.bin 32

Vamos a usar el fichero clave.bin como contraseña para el cifrado,

$ openssl enc -camellia-256-cbc -in fortuna.txt \
              -out fortuna.enc -pass file:clave.bin
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.

openssl nos advierte de que haríamos mejor en usar un algoritmo de derivación de claves en lugar de (lo que podría ser) una clave insegura en clave.bin, sin embargo la hemos generado aleatoriamente así que podemos ignorar el aviso, fortuna.enc es un fichero cifrado de forma muy segura usando el algoritmo Camellia de 256 bits en modo CBC.

$ file fortuna.enc
fortuna.enc: openssl enc'd data with salted password

Es un fichero binario, si quisiéramos compartirlo como texto (en un correo electrónico o quizás en un foro público) añadiríamos a la orden anterior la opción -base64.

El resultado tiene este aspecto:

U2FsdGVkX187oJ2dx9SYIlTOu41KbXsMf3HOM4pfekWn6dsg7ZmpxNoIgmbBeSxC
/O4CrKStNo9jGL0KBF0INA

Ahora alguien en posesión de la clave con el fichero clave.bin podría descifrarlo haciendo

openssl enc -d -camellia-256-cbc -in fortuna.enc \
            -out fortuna.txt -pass file:clave.bin

Hash

openssl permite obtener resúmenes "hash" de cualquier fichero. Veamos que algoritmos permite usar (openssl usa el término digest, dgst):

$ openssl dgst -list
Supported digests:
-blake2b512                -blake2s256                -md4
-md5                       -md5-sha1                  -ripemd
-ripemd160                 -rmd160                    -sha1
-sha224                    -sha256                    -sha3-224
-sha3-256                  -sha3-384                  -sha3-512
-sha384                    -sha512                    -sha512-224
-sha512-256                -shake128                  -shake256
-sm3                       -ssl3-md5                  -ssl3-sha1
-whirlpool

Que son 25 de ellos. Los más recomendables parecen ser sha3, blake2 y sha2.

Vamos a obtener el hash sha3 de 256 bits del fichero fortuna.txt

openssl dgst -sha3-256 fortuna.txt
SHA3-256(fortuna.txt)= b60bb27b986d060bcf99cd9aec39da080fe05df8c7fc16c36bb54b8791943ca0

Números aleatorios

Para muchos procesos criptográficos es necesario tener números aleatorios (o al menos pseudo aleatorios), un proceso que me interesa especialmente.

Vamos a generar 32 bytes aleatorios mostrando el resultado como hexadecimal

openssl rand -hex 32
d5e23d0a2765560667a42bb3e3159f55eabdbefafdfbf407e5be8f6b2a88da62

Lo mismo pero con la salida en base64

openssl rand -base64 32
3nZEnbGAslE0YWGFLFYY/fem6rJ1C2GxffnG4umx9R4=

Si tenemos un fichero con suficiente entropía podemos usarlo como opción poniendo -rand entropia.txt o mejor todavía si tenemos un dispositivo hardware generador de entropía hacer -engine (nombre).

Conclusión

openssl es un programa realmente versátil. Además de las capacidades que hemos apenas arañado de su superficie permite generar claves, firmar y verificar archivos, verificar certificados, establecer comunicaciones seguras SSL/TLS...