Geheimcode pruefen

Auf dem Laufzettel eines Besuchers stehen die Foto-ID und der Geheimcode. Ob die beiden zusammengehoeren, sagt dir diese Schnittstelle: die Antwort ist {"valid":true} oder {"valid":false}, mehr nicht. Sie antwortet unter http://fotofix/api/pruefen im Saal und unter fotofix.classic-computing.de/api/pruefen im Internet.

Mit TLS: der Code direkt

Ueber HTTPS darf der Code selbst in der Anfrage stehen:

GET https://fotofix.classic-computing.de/api/pruefen?id=MUSTER&code=PQ4M7XKD

{"valid":true}

Ohne TLS: Nonce und Proof

Ueber Port 80 - im Saal, und fuer jede Maschine ohne TLS - bleibt der Code vom Draht fern. Hol dir eine Nonce, hashe den Code, hashe noch einmal mit der Nonce davor, und schicke das Ergebnis:

GET /api/pruefen?id=MUSTER

{"nonce":"5f8a2c0d9b1e47f6a3d0c8b7e6f5a4d3"}

proof = sha256hex( nonce + sha256hex(code) )

GET /api/pruefen?id=MUSTER&nonce=5f8a...&proof=<64 Hexziffern>

{"valid":true}

Beide Hashes sind SHA-256 ueber ASCII, als Hexstring in Kleinbuchstaben; der Code steht dabei so im Hash, wie er auf dem Zettel steht: Grossbuchstaben und Ziffern. Eine Nonce gilt zwei Minuten, fuer genau eine Antwort, und nur fuer die Foto-ID, fuer die sie ausgegeben wurde.

Als Shell-Rezept:

BASE=http://fotofix.classic-computing.de
NONCE=$(curl -s "$BASE/api/pruefen?id=MUSTER" | sed 's/.*"nonce":"//;s/".*//')
HASH=$(printf %s PQ4M7XKD | sha256sum | cut -d' ' -f1)
PROOF=$(printf %s "$NONCE$HASH" | sha256sum | cut -d' ' -f1)
curl -s "$BASE/api/pruefen?id=MUSTER&nonce=$NONCE&proof=$PROOF"

Digest-Login fuer Partner-Seiten

Eine Partner-Seite kann den Besitzer eines Fotos mit dem Digest-Login des Browsers (RFC 2617) beweisen lassen, dass er seinen Geheimcode kennt - das einzige Login, das ein alter Browser ueber schlichtes HTTP beherrscht, ohne den Code zu senden. Die Challenge muss wortgleich den Realm FotoFix Geheimcode tragen und als Username die Foto-ID; die Antwort des Browsers reicht der Partner-Server hierher weiter und hoert, ob der Login echt war:

GET /api/digest-pruefen?id=MUSTER&method=GET&uri=/edit
    &nonce=...&nc=00000001&cnonce=...&qop=auth&response=<32 Hexziffern>

{"valid":true}

Die Felder sind die aus dem Authorization-Header des Browsers; ohne qop (RFC 2069) entfallen nc und cnonce. Die Nonce bleibt Sache des Partners - er hat sie ausgegeben, er beurteilt Frische und Wiederverwendung; geprueft wird hier, dass die Response den Code beweist. Der Code selbst kommt dabei nie hierher, und zurueck kommt nichts, was sich wiederverwenden liesse. Diese Schnittstelle antwortet nur im Internet, unter fotofix.classic-computing.de; die Antworten sind die der Tabelle unten.

Als Shell-Rezept, mit dem Musterpaar:

HA1=$(printf %s 'MUSTER:FotoFix Geheimcode:PQ4M7XKD' | md5sum | cut -d' ' -f1)
# f02583eec076f874892a8de36d81aced - der Browser rechnet dasselbe aus
# Username, Realm und Passwort
HA2=$(printf %s 'GET:/edit' | md5sum | cut -d' ' -f1)
RESPONSE=$(printf %s "${HA1}:abc123:00000001:xyz:auth:${HA2}" | md5sum | cut -d' ' -f1)
curl -s "$BASE/api/digest-pruefen?id=MUSTER&method=GET&uri=/edit&nonce=abc123&nc=00000001&cnonce=xyz&qop=auth&response=$RESPONSE"

{"valid":true}

Zum Ausprobieren

Das Foto MUSTER hat den veroeffentlichten Geheimcode PQ4M7XKD - an dem Paar kannst du deinen Client pruefen, und loeschen laesst sich das Musterfoto damit nicht.

Antworten

200  {"valid":true}   Foto-ID und Code gehoeren zusammen
200  {"valid":false}  falscher Code, unbekannte Foto-ID, geloeschtes Foto,
                      eine verbrauchte oder abgelaufene Nonce - oder beim
                      Digest-Login ein Foto von vor der Digest-Unterstuetzung
400  {"error":"..."}  ID nicht sechs Zeichen A-HJ-NP-Z2-9, nonce/proof
                      unvollstaendig, oder Digest-Felder missgeformt
403  {"error":"..."}  der Code selbst ueber Port 80 - nimm Nonce und Proof
429  {"error":"..."}  zu viele falsche Antworten fuer eine Foto-ID; warte
                      eine Minute

The same in English: the API answers whether a photo id and its secret code belong together. Over HTTPS send the code itself (?id=...&code=...); over plain HTTP fetch a nonce (?id=...), then send ?id=...&nonce=...&proof=sha256hex(nonce + sha256hex(code)), lowercase hex over ASCII. A nonce lasts two minutes, answers once, and is bound to its id. A partner site letting a photo's owner log in by HTTP Digest (realm FotoFix Geheimcode, username = photo id) passes the fields of the browser's answer to /api/digest-pruefen and gets the same valid true/false back. MUSTER with code PQ4M7XKD is the published pair to test against.

Zurueck zur Foto-ID-Eingabe