Ich bin an der URL-Signierung interessiert (zB Ссылка ), aber ich habe eine wenige Anforderungen, die mich noch ohne Lösung verlassen haben.
PHP
oder Python
für Seiten verwenden, also muss ich in der Lage sein, eine Signatur mit einem der beiden zu signieren und zu verifizieren. somearg=value&anotherarg=anothervalue
) Mein erster Instinkt war, OpenSSL, z. mit einem RSA-Schlüsselpaar, um etwas wie Signieren zu tun: openssl rsautl -sign -inkey private.pem -in sensitive -out privsigned
und Verifizieren basierend auf den privsigned
-Daten und Schlüssel NUR: openssl rsautl -verify -inkey public.pem -in privsigned -pubin
.
Die Verwendung von PHPs openssl_get_privatekey()
und openssl_sign()
signiert die Daten gut, aber ich muss die (entschlüsselten!) Daten kennen, um zu verifizieren (was ich nicht haben werde): openssl_get_publickey()
und openssl_verify($data, $signature, $pubkeyid);
von < a href="http://php.net/openssl_verify"> Ссылка .
Oder fehle ich hier etwas?
Also habe ich mir HMAC angeschaut, aber obwohl viele Hash-Funktionen sowohl in Python
als auch in PHP
verfügbar sind, bin ich verwirrt darüber, wie ich überprüfen würde der Hash.
PHP
's hash_hmac()
erlaubt mir, einen Hash mit einem "Schlüssel" (oder in diesem Fall einem String-Schlüssel) zu erstellen. Aber wie überprüfe ich, ob ein Hash gültig ist (d. H.% Co_de% wurde nicht nur vom Endbenutzer &sig=
manuell eingegeben.)
Also zusammenfassend (Entschuldigung für die lange Frage): Wie kann ich überprüfen, ob eine Signatur / ein Hash vom Schlüssel (cert / string) meines Servers erstellt wurde (vorausgesetzt, ich kann den Hash der Daten nicht verifizieren) ? Und haben Sie irgendwelche Präferenzen, welche Route ich wählen sollte, Priv / Pub-Key oder HMAC?
Alle großen oder kleinen Hinweise werden sehr geschätzt! Vielen Dank im Voraus,
HMAC ist ein symmetrischer Algorithmus, daher gibt es keinen separaten Erzeugungs- und Prüfalgorithmus. Um dies zu überprüfen, berechnen Sie einfach den Hash, wie er ursprünglich berechnet worden sein sollte, und überprüfen Sie, ob das Ergebnis dem entspricht, was Sie tatsächlich vom Client erhalten haben. Die Sicherheit ruht auf dem HMAC-Schlüssel, der nur auf Ihrem Server existiert.
Wenn Sie nicht möchten, dass die Signaturen von jemandem verifizierbar sind, der den geheimen Schlüssel nicht kennt, ist HMAC aus Gründen der Effizienz wahrscheinlich eine bessere Wahl als Systeme mit öffentlichem Schlüssel. Es kann einige Millisekunden dauern, eine öffentliche Schlüsselsignatur zu erstellen oder zu verifizieren (vor einigen Jahren habe ich eine Implementierung mit 15 ms pro Operation geplant), während HMAC ziemlich schnell ist.
(Oh, und Sie können keine Art von Signatur verifizieren, ohne die Daten zu kennen, die es signieren soll. Das würde, soweit ich das sehen kann, keinen Sinn ergeben.)
Wenn Sie die Signatur berechnen, müssen Sie sie URL-freundlich codieren (base64 und base32 sind beliebte Optionen) und einen HMAC-Algorithmus (wie SHA-256) auswählen und entscheiden, wie viele Bits der Signatur verwendet werden Sie möchten behalten (abgeschnitten den HMAC-Wert in der Hälfte ist in der Regel sicher). Wenn Sie sich für base64 entscheiden, achten Sie auf die verschiedenen Alphabete, die von url-safe vs. nicht-url-safe-Implementierungen verwendet werden.
Hier ist eine Pseudocode-Implementierung (ohne Fehlerprüfung oder Salzen usw.) zum Signieren von Pfad + Abfragezeichenfolge:
%Vor%HMAC SHA256 wird empfohlen und ist in allen gängigen Sprachen verfügbar.
Java:
%Vor%Python:
%Vor%PHP:
%Vor%Wenn Sie HMAC und Python verwenden möchten, dann:
$ pip installieren Sie ska
Produzierte URL sieht wie folgt aus.
Beachten Sie, dass im folgenden Beispiel request.GET
als Beispiel angegeben ist. Es wird höchstwahrscheinlich von dem abweichen, was in Ihrem Framework verwendet wird (es sei denn, Sie verwenden Django).
Die validate_signed_request_data erzeugt ein SignatureValidationResult-Objekt, das grundsätzlich zwei Eigenschaften enthält:
Tags und Links url hmac signing verification private-key