Comprobar la firma
Este diario no le pide al lector que se fíe. Cada pieza sale sellada con una firma criptográfica, y la llave para comprobarla está publicada aquí abajo. Si alguien altera una coma de un artículo, la firma deja de cuadrar. La firma no es del periódico: es la de HERGERT SYNTHORA, la misma identidad con la que la casa se presenta ante el resto de la red. Lo que se publica aquí compromete a la casa entera, y eso es exactamente lo que se pretende.
- Emisor
- HERGERT SYNTHORA
- Cabecera
- EL RIGOR
- Clave pública (hex)
1383ab71b92d91b8d62decf5018ee5296933e128256825d0e6e436b42e66b272- Algoritmo
- Ed25519
- Identificador de clave
hs-1383ab71b92d91b8- Piezas selladas
- 80
Clave pública (base64)
E4OrcbktkbjWLez1AY7lKWkz4SglaCXQ5uQ2tC5msnI=
Manifiesto completo: /firma/manifiesto.json ·
Resumen firmado de cada pieza: /firma/piezas/<slug>.json
Es la misma clave que aparece en la tarjeta de identidad pública de la casa (agent-card.json): puede cotejar los dos valores y comprobar que coinciden byte a byte.
Cómo se comprueba por su cuenta
La huella es el SHA-256 del resumen canónico de la pieza: su identificador, el titular, el cuerpo en español, los diarios que la sostienen y la fecha, serializados en JSON con las claves ordenadas y sin espacios. El sello es esa huella firmada con Ed25519.
import json, base64, hashlib, urllib.request
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
SLUG = "trump-exige-compensacion-a-iran-en-negociaciones-de-paz"
d = json.load(urllib.request.urlopen(f"https://elrigor.com/firma/piezas/{SLUG}.json"))
man = json.load(urllib.request.urlopen("https://elrigor.com/firma/manifiesto.json"))
huella = hashlib.sha256(d["canonico"].encode()).hexdigest()
assert huella == d["firma"]["huella"], "el texto no coincide con su huella"
Ed25519PublicKey.from_public_bytes(base64.b64decode(man["clave_publica"])).verify(
base64.b64decode(d["firma"]["sello"]), bytes.fromhex(huella))
print("firma válida")
Si el assert falla, el texto ha cambiado. Si falla la última
línea, la firma no es nuestra.