myproductpassport ← Retour au passeport
Enregistrement à intégrité vérifiable

Fernway FX-36 E-Bike Battery

Chaque version publiée de ce passeport reçoit une empreinte, est liée à la version précédente et signée. Si un élément de l’enregistrement était modifié par la suite, les empreintes ci-dessous ne correspondraient plus.

Inchangé depuis son enregistrement · signatures vérifiées
Empreinte actuelle (SHA-256)
b7e831dbf369cc947b766db555078e87c54bd5d9e54f7f113c4eb6c2d49d35bc
Dernier enregistrement3 nov. 2026, 16:52 UTC
Versions enregistrées1
SignatureEd25519

Historique

  1. #1 · Publié Signature valide
    Empreinte: b7e831dbf369cc947b766db555078e87c54bd5d9e54f7f113c4eb6c2d49d35bc
    Chaîne: cddfa8de6044bb8698b0a86d62eeed064a8b6b891c31a1b7ebdc8639f39b826d

Vérifiez par vous-même

  1. Téléchargez les enregistrements au format JSON ainsi que la clé publique.
  2. Pour chaque enregistrement, la valeur de chaîne est le SHA-256 des éléments suivants, un par ligne : le nom du schéma, l’identifiant du passeport, le numéro d’enregistrement, son empreinte, la valeur de chaîne précédente et l’horodatage.
  3. Vérifiez la signature Ed25519 de la valeur de chaîne à l’aide de la clé publiée. Chaque enregistrement doit également indiquer la valeur de chaîne de l’enregistrement précédent.
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")

L’empreinte couvre l’intégralité de l’enregistrement, y compris les informations restreintes et un hachage de chaque document joint : elle prouve ainsi que l’enregistrement n’a pas changé sans révéler son contenu. Elle montre que le passeport n’a pas été modifié depuis son enregistrement ; elle ne certifie pas l’exactitude des informations qu’il contient, qui relève de la responsabilité de l’opérateur économique qui l’a publié.