Uso de firmas digitales para verificar integridad de archivos binarios en Linux
Introducción

En un mundo donde los datos pueden ser interceptados o alterados, la confianza en la autenticidad de los archivos recibidos es primordial. Por ejemplo, si el Usuario A envía un archivo binario al Usuario B por email, ¿cómo puede B estar seguro de que el archivo no fue manipulado? Las firmas digitales (FD) proporcionan una solución fiable al vincular los datos a las credenciales únicas del remitente.
- La firma debe derivarse del mensaje firmado.
- Debe incorporar la información única del remitente.
- Su creación debe ser sencilla.
- Debe ser computacionalmente inviable de falsificar.
- El tamaño de la firma debe permanecer pequeño.
Este artículo demuestra una implementación práctica de FD para verificar la integridad de binarios ELF de 64 bits en Linux. El enfoque usa un esquema de firma directa (sin árbitro de terceros) y se basa en una clave privada para firmar y un certificado público para verificar.
Ejemplo de implementación de FD
Implementar la firma implica los siguientes pasos:
- Generar un hash MD5 del binario origen.
- Crear una clave privada y un certificado público autofirmado.
- Firmar el binario:
- Cifrar el hash MD5 con la clave privada.
- Almacenar el hash cifrado en una nueva sección
.sigdel archivo ELF. - Guardar el certificado en
~/.sshpara verificación posterior.
Todo el proceso puede automatizarse usando openssl, objcopy y md5sum. A continuación se muestra un script de ejemplo, sign_elf.sh, que automatiza la firma de binarios ELF. (El código fuente sin números de línea aparece al final del artículo.)
#!/bin/bash KEY_DIR="$HOME/.ssh" PRIVATE_KEY="$KEY_DIR/priv.key" CERTIFICATE="$KEY_DIR/pub.crt" SUBJECT="/C=RU/ST=Nizhni Novgorod/L=Nizhniy Novgorod/O=Auriga/OU=DEV/CN=www.auriga.com" if [ "$#" = "0" ]; then echo "Usage: sign_elfs.sh [ELF files]" exit 1 fi [ ! -d "$KEY_DIR" ] && mkdir "$KEY_DIR" # Generar clave privada y certificado openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT" for ELF_BIN in "$@"; do ELF_BASE_NAME="${ELF_BIN##*/}" ELF_BIN_SIGNATURE="$ELF_BASE_NAME.sha256" ELF_BIN_MD5="$ELF_BASE_NAME.md5" if [ ! -f "$ELF_BIN" ]; then echo "Error: no such file $ELF_BIN" exit 103 fi # Eliminar sección .sig existente objcopy --remove-section=.sig "$ELF_BIN" # Añadir sección .sig de 512 bytes rellena de ceros rm -f dummy.txt touch dummy.txt truncate --size=512 dummy.txt objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload,readonly "$ELF_BIN" # Calcular hash MD5 del binario (con sección .sig) md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5" # Firmar el hash MD5 con la clave privada openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" # Verificar la firma inmediatamente (opcional) openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" # Embeber el hash cifrado en la sección .sig objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN" # Mostrar el contenido de la sección .sig para inspección objdump -sj .sig "$ELF_BIN" done rm -f dummy.txt ls -ls ~/.ssh 
El script realiza las siguientes tareas en detalle:
Línea 19 – Generación del certificado
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT" reqcrea una solicitud de firma de certificado.-nodesproduce una clave privada en texto plano.-x509genera un certificado autofirmado.-sha256selecciona SHA‑256 para hashing.-newkey rsa:4096genera una clave RSA de 4096 bits.- El campo
SUBJECTsigue formato RFC 5280, ej./C=RU/ST=…/CN=….
Tras este paso, ~/.ssh/priv.key contiene la clave privada y ~/.ssh/pub.crt el certificado. La clave privada cifra datos; el certificado contiene la clave pública necesaria para verificación.
Bucle sobre archivos ELF (Línea 21)
Cada binario especificado en la línea de comandos se procesa secuencialmente. El script asegura que cualquier sección .sig preexistente se elimine antes de firmar de nuevo.
Gestión de secciones (Líneas 33–40)
- La sección
.sigexistente se elimina conobjcopy --remove-section=.sig. - Se crea un archivo placeholder de 512 bytes y se añade como sección
.sigde solo lectura, no cargable.
Cálculo del hash (Línea 42)
md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5" Se computa MD5 sobre el binario, incluyendo la sección .sig placeholder, y se almacena en nombre_binario.md5.
Firma del hash (Línea 45)
openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" El hash MD5 se cifra con la clave privada, produciendo un archivo de firma (ej. nombre_binario.sha256).
Verificación (Opcional) (Línea 48)
openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" Este paso confirma que la firma coincide con el hash usando la clave pública extraída del certificado.
Incrustación de la firma (Línea 52)
objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN" El hash cifrado reemplaza al placeholder, finalizando el binario ELF firmado.
Ejecutar el script sobre un conjunto de archivos ELF producirá binarios firmados que pueden distribuirse de forma segura. El destinatario puede verificar la integridad extrayendo la sección .sig, descifrándola con el certificado público y comparando el hash resultante con uno recién calculado del archivo recibido.
Tecnología de Internet de las cosas
- Aproveche la Industria 4.0: Estrategias probadas para construir una hoja de ruta digital ganadora
- Redes neuronales aceleran la reconstrucción de imágenes de rayos X
- Impulsando sinergias IoT: Cómo el CoC de Conectividad de Bosch moldea un futuro conectado
- Preparando sus operaciones de fabricación para la IA con IoT
- Gemelos digitales: desbloqueando el IoT de borde inteligente en manufactura – Parte 2
- Mantenimiento Predictivo: Aprovechar Industria 4.0 para Producción Ininterrumpida
- ¿Está tu planta de fabricación lista para IoT? Guía práctica
- Seguros digitales: 5 tendencias que revolucionan cómo compramos y gestionamos coberturas
- Western Digital lanza almacenamiento 3D NAND robusto de 64 capas para Industrial IoT y Edge Computing
- Western Digital lanza almacenamiento 3D NAND robusto de 64 capas para Industrial IoT
- Por qué la computación en la nube es esencial para almacenar datos IoT