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.
Ueber HTTPS darf der Code selbst in der Anfrage stehen:
GET https://fotofix.classic-computing.de/api/pruefen?id=MUSTER&code=PQ4M7XKD
{"valid":true}
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"
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}
Das Foto MUSTER hat den veroeffentlichten Geheimcode
PQ4M7XKD - an dem Paar kannst du deinen Client pruefen, und
loeschen laesst sich das Musterfoto damit nicht.
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.