Registro a prueba de manipulaciones
Fernway FX-36 E-Bike Battery
Cada versión publicada de este pasaporte recibe una huella digital, se vincula a la versión anterior y se firma. Si posteriormente se modificara algo en el registro, las huellas digitales siguientes dejarían de coincidir.
Sin modificaciones desde su registro · firmas verificadasHuella digital actual (SHA-256)
b7e831dbf369cc947b766db555078e87c54bd5d9e54f7f113c4eb6c2d49d35bc
Historial
-
#1 · Publicado Firma válidaHuella digital: b7e831dbf369cc947b766db555078e87c54bd5d9e54f7f113c4eb6c2d49d35bc
Cadena: cddfa8de6044bb8698b0a86d62eeed064a8b6b891c31a1b7ebdc8639f39b826d
Compruébelo usted mismo
- Descargue los registros en JSON y la clave pública.
- Para cada registro, el valor de cadena es el SHA-256 de: el nombre del esquema, el ID del pasaporte, el número de registro, su huella digital, el valor de cadena anterior y la hora, uno por línea.
- Compruebe la firma Ed25519 del valor de cadena con la clave publicada. Cada registro debe indicar también el valor de cadena del registro anterior.
import json, hashlib, base64, urllib.request
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
doc = json.load(urllib.request.urlopen("https://myproductpassport.eu/p/3daf1fbb-004d-4881-8515-9571e900f3eb/integrity.json"))
keys = {k["key_id"]: k["public_key"] for k in json.load(urllib.request.urlopen("https://myproductpassport.eu/.well-known/mpp-integrity-keys.json"))["keys"]}
prev = None
for r in doc["records"]:
line = "\n".join([doc["schema"], doc["passport_uuid"], str(r["sequence"]), r["content_hash"], r["previous_hash"] or "", r["recorded_at"]])
assert hashlib.sha256(line.encode()).hexdigest() == r["chain_hash"] and r["previous_hash"] == prev
Ed25519PublicKey.from_public_bytes(base64.b64decode(keys[r["key_id"]])).verify(base64.b64decode(r["signature"]), r["chain_hash"].encode())
prev = r["chain_hash"]
print("verified", len(doc["records"]), "records")
La huella digital abarca todo el registro, incluida la información restringida y un hash de cada documento adjunto, por lo que demuestra que el registro no ha cambiado sin revelar su contenido. Muestra que el pasaporte no se ha modificado desde que se registró; no certifica que la información que contiene sea correcta, lo cual sigue siendo responsabilidad del operador económico que lo publicó.