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
| Palabra | Qué significa |
|---|---|
| Firma digital | un hash cifrado con la clave privada de quien firma |
| Verificar | comprobar una firma con la clave pública del firmante |
| Certificado | un documento que une un nombre con una clave pública |
| Autoridad de certificación | una entidad que firma certificados y garantiza el nombre |
| Cadena de confianza | la lista de certificados que va de un sitio a una raíz de confianza |
| HMAC | un 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
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
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
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
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
| Certificado | Para quién | Firmado por | Quién lo garantiza |
|---|---|---|---|
| 1 | www.tiendaejemplo.es | Autoridad intermedia A | La intermedia A |
| 2 | Autoridad intermedia A | Autoridad raíz R | La raíz R |
| 3 | Autoridad raíz R | Autoridad raíz R | Tu 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.