Zum Inhalt springen

Transparenzprotokoll

Alles, was wir signieren, öffentlich

Jede Signatur von Content Credentials, jeder Zeitstempel und jedes signierte Prüfergebnis, das Kennmarq.com herausgibt, wird zuerst in dieses Protokoll geschrieben. Das Protokoll kann nur wachsen, und solange es wächst, signieren wir jede Stunde, mindestens aber einmal am Tag, eine Wurzel über seinen gesamten Inhalt. Alle können prüfen, dass die Signatur einer Datei darin steht und dass nie etwas entfernt, verändert oder rückdatiert wurde.

Neueste signierte Wurzel

Einträge
563
Signiert
(Wurzel 149)
Wurzel-Hash
897c3b232864c2c9130f7d67a12815bb865d0ca08f4efec23f83e5b78f2fa893
Schlüssel-ID
3b51f0f999b77a04bd96b2b86fa783237f5f33f29c55275a7e5a06ad7230829e
Signatur
MEYCIQDvtHKEuzfherpaixgaZFQUw3aaS2FIuay/ETvcVGbgVQIhAJc6l/rUw38Yoi04yj1bKKbZyGIr5I24JaE4ezqbC5uB

Derzeit 563 Einträge im Protokoll. Als JSON: https://api.kennmarq.com/v1/log/root

Was hineinkommt

  • Signaturen: für jede über die API markierte Datei das Label ihres Manifests und der SHA-256 der Datei, ihrer Signatur, des Signaturzertifikats und des Zeitstempels in der Signatur. Bei einer im lokalen Modus markierten Datei, die uns nie erreicht, tritt ihr Hard Binding an die Stelle ihres SHA-256.
  • Zeitstempel: für jedes Token unseres Zeitstempelservers seine Seriennummer, sein Zeitpunkt, sein SHA-256 und der Hash, den es mit einem Zeitstempel versieht.
  • Anker der Audit-Logs: Das Audit-Log jeder Organisation ist per Hash verkettet; sein neuester Hash kommt hierher, unter einem Pseudonym, das nur die Mitglieder der Organisation erkennen können, sodass sich sein Verlauf nicht unbemerkt umschreiben lässt.
  • Signierte Prüfergebnisse: für jedes Ergebnis von POST /v1/verify, das wir signieren, sein SHA-256, der SHA-256 der geprüften Datei und die ID des Schlüssels unseres Prüfdienstes.

Nie darin: Namen oder IDs von Organisationen, Dateinamen oder -inhalte, Wasserzeichen-IDs, Modelle, Apps oder Titel, Adressen oder Personen. Wer eine Datei hat, kann ihren Eintrag finden; alle anderen erfahren aus dem Protokoll nichts.

Selbst prüfen

  1. Finden Sie den Eintrag einer Datei über das Label ihres Manifests oder über den X-Log-Index, den die API mit ihr zurückgegeben hat: GET /v1/log/proof/urn:c2pa:… antwortet mit dem Eintrag und den Hashes, die ihn mit einer signierten Wurzel verbinden.
  2. Prüfen Sie, ob der Eintrag zur Datei passt (ihr SHA-256, das Label ihres Manifests), und rechnen Sie den Beweis bis zur Wurzel hoch.
  3. Prüfen Sie die Signatur der Wurzel mit unserem öffentlichen Schlüssel (siehe unten).
  4. Bewahren Sie die Wurzeln auf, die Sie gesehen haben. GET /v1/log/consistency beweist, dass jede spätere Wurzel noch mit allen Einträgen einer früheren beginnt.

Die API-Referenz enthält die genauen Formate und die wenigen Zeilen Shell und Python, die jede Prüfung durchführen. Der Baum folgt RFC 9162 (Certificate Transparency), und Wurzeln werden wie die Tree Heads aus RFC 6962 signiert, sodass vorhandene Tools und Bibliotheken funktionieren.

Die neueste Wurzel mit OpenSSL (und jq) verifizieren
curl -s "https://api.kennmarq.com/v1/log/key?format=pem" -o log-key.pem
curl -s "https://api.kennmarq.com/v1/log/root" -o root.json
printf '0001%016x%016x%s' "$(jq .timestamp root.json)" "$(jq .tree_size root.json)" \
  "$(jq -r .root_hash root.json)" | xxd -r -p > tree-head.bin
jq -r .signature root.json | base64 --decode > signature.der
openssl dgst -sha256 -verify log-key.pem -signature signature.der tree-head.bin

Letzte Wurzeln

Die zehn neuesten signierten Wurzeln
WurzelSigniertEinträgeWurzel-Hash
149563897c3b232864c2c9130f7d67a12815bb865d0ca08f4efec23f83e5b78f2fa893
148550533fa80cc9342b3b7d2a938e123583adaa3a3ff1e1f15a5e0c567b9285ae5c5c
147544cb537fb383038e50850a7e8ebdbab3e01ef879e50e161ff38666ba8ae6d8da76
146543f4b334fc696c7580c8dfd1cc72655e3470da10d61708f3fe861f3ddc3a92177b
14554220737af83ce09bc9955cf5659eab4f4de98c999bfb02a28c0608f09b4e07dfe0
144537cbac0d45d78547b09fb5a56e65770c68ce5112e648c9d2350c7c80fbdc2eb7ce
1435221e76b52cd13890935c1918437a9bf508c10d1ac1f936a25a338659824d11e9eb
14251680391ea31eb3546589ed9c6e78d1a78efb2a3bddd0eae4ba6b6c9a4353f4f44b
141515df323aad2b192d395ade8d304389e7bdc0af1a6233d9b8ab4e57ad42c15e5c13
140514f9ba75d9da9f43887116258817f14d2e37bef979e0bdcc11a820c160762ee801

Alle Wurzeln, die neueste zuerst: GET /v1/log/roots.

Unser Protokollschlüssel

ECDSA P-256 mit SHA-256. Schlüssel-ID 3b51f0f999b77a04bd96b2b86fa783237f5f33f29c55275a7e5a06ad7230829e, der SHA-256 des unten stehenden Schlüssels im DER-Format. Er signiert nur Tree Heads, und sein privater Schlüssel verlässt AWS KMS nie.

PEM
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE42CpuoaS4/rNCAyQ08euvOtCa9X3
Zuq7bXjiCyeh4C0O92Ey6CbvOtfkS11IoLLFWFzzXrcpi/0L2vDeXsufyw==
-----END PUBLIC KEY-----
Unsere Zeitstempel kommen von unserem eigenen Server nach RFC 3161, deshalb ist jeder einzelne hier verzeichnet. Die Zeit in einem Zeitstempel und die Zeit, zu der sein Eintrag protokolliert wurde, stehen nebeneinander, und sobald eine Wurzel sie erfasst, kann sich keine der beiden mehr ändern.