¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Firma digital y certificados

Después de esta lección: Puedo explicar cómo una firma y un certificado prueban quién envió algo.

Lección de 55 min3 comandosLaboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

Cómo saber quién envió un mensaje

Una firma digital prueba quién envió un mensaje y que nadie lo ha cambiado desde entonces. Es lo que permite confiar en una actualización de software o en un contrato enviado por correo.

Un banco publica una nueva versión de su aplicación. Tu móvil solo la instala si la firma es del banco.

Al final de esta lección

Nota

Puedo explicar cómo una firma y un certificado prueban quién envió algo.

Palabras clave

PalabraQué significa
Firma digitalun hash cifrado con la clave privada de quien firma
Verificarcomprobar una firma con la clave pública del firmante
Certificadoun documento que une un nombre con una clave pública
Autoridad de certificaciónuna entidad que firma certificados y garantiza el nombre
Cadena de confianzala lista de certificados que va de un sitio a una raíz de confianza
HMACun hash que además usa una clave secreta compartida

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Firmar es cifrar el hash

Para firmar, calculas el hash del mensaje y lo cifras con tu clave privada. El resultado es la firma, que viaja con el mensaje.

Para verificar, quien recibe descifra la firma con tu clave pública y calcula el hash del mensaje. Si los dos hashes coinciden, la firma es buena.

Firma un pedido con la clave privada

Comando
python3 -c "import hashlib; h = int(hashlib.sha256(b'pedido 2043').hexdigest(), 16) % 187; print(h, pow(h, 23, 187))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Verifica la firma con la clave pública

Comando
python3 -c "print(pow(144, 7, 187))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Firma, verifica y prueba un mensaje cambiado

Código: python
import hashlib

# Firma de juguete: el hash se reduce para que quepa en n = 187.
n = 187
e = 7        # clave pública
d = 23       # clave privada

def hash_corto(texto):
    return int(hashlib.sha256(texto.encode()).hexdigest(), 16) % n

mensaje = "pedido 2043"
firma = pow(hash_corto(mensaje), d, n)
print("Firma:", firma)
print("¿Válida?", pow(firma, e, n) == hash_corto(mensaje))
print("¿Y con otro mensaje?", pow(firma, e, n) == hash_corto("pedido 2044"))

Un error frecuente

Advertencia

Mucha gente cree que firmar es cifrar el mensaje para que nadie lo lea. No es así. La firma prueba el autor y que no hubo cambios. El mensaje puede seguir a la vista de todos.

Un HMAC usa una clave compartida

Un HMAC es un hash mezclado con una clave secreta que conocen los dos extremos. Prueba que el mensaje no cambió y que lo hizo alguien con la clave.

Pero cualquiera de los dos pudo generarlo. Una firma digital solo la hace quien tiene la clave privada, así que prueba quién fue.

Calcula un HMAC con una clave compartida

Comando
python3 -c "import hmac, hashlib; print(hmac.new(b'clave', b'pedido 2043', hashlib.sha256).hexdigest())"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un certificado une nombre y clave

Una firma solo vale si tienes la clave pública correcta. Un atacante podría darte la suya diciendo que es de tu banco.

Un certificado lo resuelve: dice "esta clave pública es de este nombre" y lo firma una autoridad de certificación en la que confías.

Ejemplo: una cadena de confianza

CertificadoPara quiénFirmado porQuién lo garantiza
1www.tiendaejemplo.esAutoridad intermedia ALa intermedia A
2Autoridad intermedia AAutoridad raíz RLa raíz R
3Autoridad raíz RAutoridad raíz RTu sistema ya confía en ella

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Para ir más lejos

Cambia en la orden de firma el texto pedido 2043 por pedido 2044 y firma otra vez. Verifica con la firma antigua, 144.

Antes de ejecutar, di si esperas que coincida. Con números tan pequeños, a veces coincide por casualidad. Una clave real lo evita.

Sobre este laboratorio y su código: Laboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.