Ich habe die API-Kommunikation gelesen und versucht herauszufinden, wie eine sichere API am besten aufgebaut werden kann. Ich weiß, dass OAuth und solche existieren, aber ich versuche auch, mich in diesem Prozess zu bilden und mich nicht auf Bibliotheken zu verlassen.Schutz vor Replay-Angriffen bei Verwendung von Anforderungssignaturen in sicherer API-Kommunikation?
Grundsätzlich habe ich einen Web-Service und in diesem Web-Service können Benutzer für API registrieren. Sie erhalten eine Profil-ID und einen geheimen Schlüssel, den sie verwenden müssen, um die API-Anfrage von einem anderen Web-System zu erstellen.
API-Anfrage ähnlich wie die Art und Weise gebaut Banken es tun, werden alle Eingabedaten an API gesendet sortiert werden, Hash berechnet und dann den Hash an den Server gesendet, wie folgt aus:
// Profile data
$apiProfile='api123';
$apiSecret='this-is-a-good-day-to-be-a-secret-key';
// Input
$input=array();
$input['name']='Thomas Moore';
$input['profession']='Baker';
// To ensure that the order of variables checked and received is the same on both ends:
ksort($input);
// Using serialize() for simplifying things
// http_build_query() is another option, or just placing values in order
$input['hash']=sha1(serialize($input).$apiSecret);
// Making a request to URL:
// Using file_get_contents() as an example, would use cURL otherwise
$result=file_get_contents('http://www.example.com/api.php?'.http_build_query($input));
// SERVER CALCULATES COMPARISON HASH BASED ON KNOWN SECRET KEY AND INPUT DATA
Diese ist wirklich gut und funktioniert. Aber! Mein Problem ist der mögliche Replay-Angriff. Wenn jemand diese Anforderungs-URL abruft, kann er sie erneut an den Server senden, obwohl sie die Daten selbst nicht ändern kann.
Jetzt habe ich ein paar Dinge darüber gelesen, dass Sie entweder die Zeit überprüfen oder ein einmal benutztes Token zu der Anfrage hinzufügen sollten, aber ich bin mir nicht sicher, wie genau soll ich das machen? Senden Sie einen Zeitstempel mit der Anfrage wirklich sicher genug? (Der empfangende Server würde sicherstellen, dass die Anfrage wenige Sekunden innerhalb der Zeit, in der die Anfrage gemacht wurde, entstanden ist, wenn die Uhren etwas synchron sind).
Ich könnte dem Mix auch IP-Validierungen hinzufügen, aber diese können sich ändern und können etwas gefälscht werden und sind für den Benutzer mühsamer.
Ich würde diesen One-Time-Token-Systemtyp lieben, aber ich bin mir nicht sicher, wie das geht, ohne die Token-Generierung dem exakt gleichen Replay-Angriffs-Problem auszusetzen? (Das letzte, was ich brauche, ist es, sichere Tokens für Mittelmänner zu vergeben).
Meinungen und Artikel wären wirklich willkommen, ich konnte kein Material finden, das meine spezifischen Anliegen beantwortet. Ich möchte sagen, dass meine API sicher ist, ohne dass es nur Marketing ist.
Vielen Dank!
Vielen Dank für das Votum des Vertrauens, ich bin nur ein paranoider Perfektionist, nehme ich an. – kingmaple
Ich könnte einen tatsächlichen HMAC verwenden, um Angriffe mit Längenverlängerung zu vermeiden, obwohl es so aussieht, als ob Sie nicht verwundbar sind, da Sie das Geheimnis als letztes und nicht als erstes platzieren. http://en.wikipedia.org/wiki/Hmac http://en.wikipedia.org/wiki/Length_extension_attack – alberge