Einen Captilo-Nachweis ohne Captilo prüfen

Ein Captilo-Zertifikat hängt nicht von Captilo ab. Mit dem Zertifikat, Standardwerkzeugen und der öffentlichen Sonic-Blockchain kann jeder mit IT-Kenntnissen bestätigen, dass ein Foto und sein Datensatz genau dem entsprechen, was verankert wurde, und wann. Hier sind die vier Prüfschritte und ein Skript, das sie für Sie ausführt.

Sie brauchen
Das Zertifikat als PDF
Werkzeuge
Poppler, Python oder ein beliebiges SHA-256-Tool
Blockchain
Sonic, über sonicscan.org oder einen beliebigen Node
Captilo-Server
Nicht beteiligt

Vier Prüfschritte, alle gegen Werte, die Sie selbst sehen

Jeder Schritt vergleicht etwas, das Sie selbst berechnen, mit der Datei, einem auf dem Zertifikat gedruckten Wert oder dem auf der Blockchain gespeicherten Eintrag. Ein Nachweis ist nur gültig, wenn alle vier Schritte bestanden sind.

  1. 1

    Das Zertifikat ist so, wie Captilo es ausgestellt hat

    Die Fingerabdrücke belegen die Bytes in der Datei, nicht das, was ein PDF-Viewer anzeigt: Jemand könnte das Originalfoto in der Datei lassen und ein anderes Bild darüberlegen, es auf Punktgröße verkleinern, eine Seite hinzufügen oder die Datei mit Änderungen neu speichern. Sehen Sie sich deshalb zuerst die Datei an. Sie muss genau eine Seite pro Nachweis haben (ein Zertifikat mit mehreren Nachweisen druckt „Proof N of M“) und genau ein %%EOF, denn Captilo schreibt sie in einem Durchgang. Auf jeder Seite muss pdfimages genau ein Bild mit enc „jpeg“ auflisten, das Foto, an der längeren Seite mindestens 200 pt groß dargestellt (Breite × 72 ÷ x-ppi), und höchstens zwei weitere Bilder, Logo und QR-Code, jeweils höchstens 100 pt (beim Logo kommt eine smask-Zeile dazu). Den Rest prüft das Skript: nichts über dem Foto, keine weiteren Schriften, Muster oder Ebenen, und jedes Objekt an der Stelle, die die Cross-Reference-Tabelle der Datei angibt.

    pdfinfo certificate.pdf | grep Pages
    grep -c -a "%%EOF" certificate.pdf           # must print 1
    pdfimages -list certificate.pdf

    Eine Seite pro Nachweis, eine Revision, ein JPEG-Foto pro Seite und daneben nur Logo und QR-Code.

  2. 2

    Das Foto ist unverändert

    Das Foto im Zertifikat ist die Original-Bilddatei, Byte für Byte eingebettet. Extrahieren Sie es Seite für Seite mit pdfimages aus Poppler: -j schreibt das eine JPEG der Seite als .jpg-Datei (Logo und QR-Code kommen in anderen Formaten heraus). Hashen Sie genau diese Datei, nie „das größte Bild in der Datei“: Es zählt das Foto, das die Seite tatsächlich darstellt.

    pdfimages -j -f 1 -l 1 certificate.pdf page1  # page 1: exactly one page1-*.jpg
    sha256sum page1-*.jpg                        # Linux
    shasum -a 256 page1-*.jpg                    # macOS
    Get-FileHash page1-*.jpg -Algorithm SHA256   # Windows PowerShell

    Der Fingerabdruck entspricht dem Picture Hash.

  3. 3

    Der Datensatz ist unverändert

    Unter den Hashes druckt das Zertifikat den signierten Datensatz der Aufnahme: Zeit, Ort, Gerät und Prüfergebnisse, als kanonisches JSON (RFC 8785). Die Regel steht auf dem Zertifikat selbst: Der SHA-256 genau dieses Textes ist der Metadata Hash. Extrahieren Sie den Text und fügen Sie die Zeilen des Datensatzes von der öffnenden { bis zur schließenden } zusammen, ohne ein einziges Zeichen hinzuzufügen oder zu entfernen, auch keinen abschließenden Zeilenumbruch. Derselbe Datensatz ist zusätzlich in der Datei eingebettet; das Skript prüft auch, dass der gedruckte mit ihm übereinstimmt.

    pdftotext -raw certificate.pdf certificate.txt
    # join the record’s lines into record.json, then:
    sha256sum record.json

    Der Fingerabdruck entspricht dem Metadata Hash.

  4. 4

    Beide Fingerabdrücke stehen auf der Blockchain

    Ganz ohne Programmieren: Öffnen Sie den Sonic-TX-Link des Zertifikats. Er zeigt die Transaktion auf sonicscan.org, einem öffentlichen Block-Explorer, den Captilo nicht betreibt. Prüfen Sie, dass die Transaktion erfolgreich war und an das Captilo-Register ging, und sehen Sie sich dann die Rohdaten (Input Data) an: Picture Hash, Metadata Hash und die Event-ID ohne Bindestriche stehen dort hexadezimal. Oder fragen Sie direkt einen beliebigen Sonic-Node:

    curl -s https://rpc.soniclabs.com -H 'Content-Type: application/json' -d '{
      "jsonrpc": "2.0", "id": 1, "method": "eth_call",
      "params": [{ "to": "0x3A6873D7A36E3FcD89AF557a24de2DaAFf09cB9b",
                  "data": "0x1b80bb3a00000000000000000000000000000000<Event ID without dashes>" }, "latest"]
    }'

    Die Antwort ist 0x, gefolgt von acht Blöcken mit je 64 Zeichen: Picture Hash, Metadata Hash, zwei interne IDs, Aufnahme- und Verankerungszeit als Unix-Sekunden in Hex, die Nachweisversion und ein letzter Block, der auf 1 endet, wenn der Nachweis existiert. Die Version schreibt der Server von Captilo, nicht das Telefon: 3 heißt, dass der Server eine Live-Nonce der Aufnahme verbraucht hat (eine Online-Aufnahme). Bei einem Nachweis, der am oder nach dem 2026-09-04, 08:21:52 UTC verankert wurde, heißt Version 2, dass keine Nonce verbraucht wurde: Behandeln Sie ihn als Offline-Aufnahme (nur die Uhrzeit des Geräts), unabhängig davon, was im Datensatz steht. Ist der Node nicht erreichbar, wurde nichts geprüft: Versuchen Sie es erneut.

    Das Register liefert beide Hashes unter der Event-ID, zusammen mit dem Zeitpunkt der Verankerung.

Alle vier Prüfschritte mit einem Skript

verify_captilo_certificate.py prüft die Datei und jede Nachweisseite eines Zertifikats nach denselben Regeln wie captilo.app und die Captilo-App, aber mit eigenem Code. Es nutzt nur die Python-Standardbibliothek und pdftotext aus Poppler, kontaktiert ausschließlich den Sonic-Node Ihrer Wahl und lässt sich vor dem Ausführen vollständig lesen.

Voraussetzungen: Python 3.8 oder neuer und Poppler (poppler-utils unter Linux, brew install poppler unter macOS oder ein Windows-Build). Wir testen das Skript mit einer Sammlung unveränderter Zertifikate und Fälschungen (Foto ausgetauscht, Bild über das Foto gelegt, Seiten hinzugefügt oder vertauscht, Datensatz entfernt); bei jedem kommt es zum selben Ergebnis wie captilo.app.

verify_captilo_certificate.py herunterladen
python3 verify_captilo_certificate.py certificate.pdf

# optional:
#   --rpc <any Sonic node>
#   --poppler <folder with pdftotext>
#   --json      (the result as JSON)
#   --registry <contract address>

Ausgabe für ein unverändertes Zertifikat, gekürzt

Registry 0x3A6873D7A36E3FcD89AF557a24de2DaAFf09cB9b on Sonic (chain 146) via https://rpc.soniclabs.com

Page 1: event 6e63c095-5d97-57b5-8f85-26932c6c4147
  picture SHA-256 (the photo the page draws)  f9289612261be27f…3eb433342deb
  record SHA-256 (embedded metaCanon)        6550edb0ae528f75…e73344b51
  VERIFIED
  anchored at 2026-09-17 11:36:28 UTC; capture online

VERIFIED: 1 of 1 proof(s) verified.

Referenz

Alles, was Entwickler brauchen, um Nachweise automatisiert zu prüfen. Der Sonic-TX-Link jedes Zertifikats zeigt die Register-Adresse außerdem als Empfänger der Transaktion.

Netzwerk
Sonic Mainnet, Chain-ID 146
Register-Contract
CaptiloProofRegistryV20x3A6873D7A36E3FcD89AF557a24de2DaAFf09cB9b
Abfrage
getProof(bytes32 eventId), Funktionsselektor 0x1b80bb3a. Liefert pictureHash, metadataHash, orgId, tenantId, deviceTimestamp, blockTimestamp, version und exists.
Event-ID als bytes32
Bindestriche entfernen und links mit Nullen auf 64 Hex-Zeichen auffüllen.
Öffentlicher RPC
https://rpc.soniclabs.com oder ein beliebiger anderer Sonic-Mainnet-Node
Fingerabdrücke
SHA-256, in Kleinbuchstaben hexadezimal geschrieben

Was die Prüfung belegt und was nicht

Sie belegt, dass das Foto und sein signierter Datensatz genau dem entsprechen, was auf der Sonic-Blockchain verankert wurde, und wann das geschah. Keiner der Prüfschritte ist auf Captilo angewiesen: Das Zertifikat, ein öffentlicher Block-Explorer oder Node und Standardwerkzeuge genügen.

Der qualifizierte eIDAS-Zeitstempel ist auf dem Zertifikat gedruckt, sein Token aber nicht in der Datei eingebettet. Ohne Captilo ist deshalb die Blockzeit der Blockchain die unabhängige Zeitreferenz.

Was eine Seite darstellt, wird geprüft, soweit es um Bilder geht: ein Foto, vollständig dargestellt, nichts darüber. Formen oder Text über dem Foto werden nicht erkannt. Vergleichen Sie daher das angezeigte Bild mit dem extrahierten JPEG.

Ein Nachweis zeigt, was das Telefon erfasst hat, nicht, wer ausgelöst hat oder ob die Szene gestellt war. Der Haftungsausschluss beschreibt diese Grenzen.

Geltungsbereich. Diese Schritte gelten für aktuelle Zertifikate, die den gedruckten Datensatz auch eingebettet enthalten. Ältere Formate (ein einzelner Dokument-Hash oder kein eingebetteter Datensatz) werden nicht mehr unterstützt: Erstellen Sie in der App ein neues Zertifikat für das Foto. Ein Zertifikat, das vor der Bestätigung seines Nachweises erstellt wurde, hat eventuell keinen Transaktionslink: Das Skript braucht nur die Event-ID.