
Teilen Sie:
Lorna ist eine Software-Ingenieurin mit einer unheilbaren Blogging-Sucht. Sie versucht, Worte und Code gleichermaßen zu bändigen.
Verwendung von Nachrichtensignaturen zur Gewährleistung von sicheren eingehenden Webhooks
Lesedauer: 4 Minuten
Einseitige Unterhaltungen machen keinen Spaß - bei Vonage dreht sich alles um zweiseitige Unterhaltungen, und dazu gehören auch unsere APIs. Um zum Beispiel eine SMS zu senden, rufen Sie unsere API auf. Um eine SMS-Antwort zu erhalten, muss Ihre Anwendung einen eingehenden Webhook verarbeiten. Webhooks eignen sich hervorragend für die Verwendung von HTTP zur Benachrichtigung über Ereignisse, erfordern aber, dass Ihre Anwendung unter einer öffentlichen URL verfügbar ist. Der Nachteil? Ihre öffentliche URL ist, nun ja, öffentlich. Jeder kann Daten an sie senden, und wie können Sie sicher sein, dass die Nachrichten von Vonage stammen?
Anmerkung: Die Verwendung von Nachrichtensignaturen zur Verifizierung eingehender Webhooks ist derzeit nur für die Vonage SMS API verfügbar.
Dies ist ein häufiges Problem mit Webhooks in allen Arten von Applikationen. Wir von Vonage empfehlen Ihnen, die Nachrichten-Signierung auf Ihrem Account zu aktivieren, um die Sicherheit der eingehenden Webhooks zu gewährleisten. In diesem Artikel wird erklärt, wie die Nachrichtensignaturen funktionieren und wie Sie diese für Ihre eigenen Applications einrichten können. Der gleiche Ansatz wird an einigen Stellen verwendet, aber das heutige Beispiel zeigt es im Kontext des Empfangs einer SMS, wir haben einige Code-Beispiele für den Empfang einer SMS falls Sie daran interessiert sind, bevor wir eintauchen.
Signieren von Nachrichten aktivieren
Bei neuen Vonage Accounts ist die Nachrichtensignatur nicht standardmäßig aktiviert, daher sollten Sie zunächst eine E-Mail an support@nexmo.com um die Aktivierung der Nachrichtensignatur für Ihren Account zu beantragen. Es gibt eine zweite Option, mit der Sie verlangen können, dass alle von Ihnen gesendeten Nachrichten mit einer Signatur versehen werden; diese Verwendung wird heute nicht behandelt, aber es ist wichtig zu wissen, dass es sie gibt.
Holen Sie sich Ihre Unterschrift Geheimnis
Sobald Sie die Signierung aktiviert haben, sollten Sie die Einstellungsseite in Ihrem Dashboard. Hier können Sie festlegen, welcher Signaturalgorithmus verwendet werden soll (ich verwende die Option SHA-256 HMAC Option in diesen Beispielen), und Sie können auf Ihr Signaturgeheimnis zugreifen. Kopieren Sie dieses Signaturgeheimnis, es ist das "gemeinsame Geheimnis", das wir zur Berechnung der Signaturen auf Server und Client verwenden werden.
Ein "gemeinsames Geheimnis" ist ein Schlüssel, der im Voraus zwischen zwei Parteien ausgetauscht wird, in diesem Fall zwischen den Servern von Vonage und Ihnen. Dieses gemeinsame Geheimnis wird nie übertragen, sondern sowohl von Vonage als auch von Ihrer Anwendung verwendet, um sicherzustellen, dass die Daten vom erwarteten Server stammen und nicht verändert wurden.
Auf dieser Einstellungsseite gibt es auch die Möglichkeit, das HTTP-Verb für Ihre Webhooks zu ändern POST. Der Standard ist GET und die Beispiele hier verwenden GET aber wenn Sie es ändern möchten (ich persönlich bevorzuge POST bevorzugen), finden Sie diese Einstellung hier unter "Standard-SMS-Einstellung" -> "HTTP-Methode".
Vonage kocht eine Signatur
Wenn eine SMS bei Ihrer Vonage-Nummer eingeht, sendet Vonage einen Webhook an die für diese Nummer konfigurierte URL, der alle Informationen über die eingehende Nachricht enthält. Wenn Nachrichtensignaturen aktiviert sind, wird auch eine Signatur berechnet, die zusammen mit der Nachricht gesendet wird.
Sie können die detaillierte Anleitung zum Erstellen einer Signatur aber die Kurzversion lautet:
Formularfelder in alphabetischer Reihenfolge abrufen und zu einer langen Zeichenfolge aus Schlüsseln und Werten verketten
Das Signaturgeheimnis an das Ende anhängen
Verschlüsseln Sie die von Ihnen erstellte Zeichenfolge nach dem gewählten Algorithmus, z. B. SHA-256 HMAC. Und los geht's! Dies ist die Signatur
Ein Hash ist eine textuelle Darstellung einer (in der Regel längeren) Zeichenfolge. Aus dem Hash lässt sich die ursprüngliche Zeichenfolge nicht zurückentwickeln. Wir können diesen Hash (in diesem Fall die Nachrichtensignatur) sicher übermitteln, ohne Gefahr zu laufen, die Zeichenfolge, aus der er erstellt wurde, preiszugeben.
Vonage sendet die Daten und eine Signatur
Nachdem die Signatur erstellt wurde, wird der Webhook, der die Nachrichtendaten und die Signatur, aber NICHT das Geheimnis enthält, an die URL gesendet, die Sie für diese Nummer konfiguriert haben. Das sieht in etwa so aus:
msisdn: 44784xxxxxxx
to: 44741xxxxxxx
messageId: 16000002632BEC99
text: Next step
type: text
keyword: NEXT
message-timestamp: 2019-01-23 10:51:39
timestamp: 1548240699
nonce: 9a706fdd-2b68-4761-87ab-c6ea80cab452
sig: 062470CA9A00C81FBF32FACE34B73D819BCDED07B36203DF7C0714E1094D86DEWir erhalten diese Daten in unserer Anwendung und können sie zusammen mit dem zuvor kopierten Signaturgeheimnis verwenden, um die Signatur neu zu erstellen und sie mit den eingegangenen Daten zu vergleichen.
Berechnen Sie die erwartete Signatur
Anhand der übermittelten Daten und des Signaturgeheimnisses können wir in denselben Schritten eine Signatur erstellen und sicherstellen, dass wir etwas erhalten, das genau übereinstimmt. Der manuelle Prozess wurde oben skizziert und verlinkt, aber unsere Server-SDKs für den von Ihnen gewählten Tech-Stack erstellen die Signatur für Sie.
Zum Beispiel ist hier die PHP-Bibliothek in Aktion:
$signature = new \Nexmo\Client\Signature(
$_GET,
NEXMO_API_SIGNATURE_SECRET,
'sha256'
);
$isValid = $signature->check($_GET['sig']);
Der Wert von $isValid gibt an, ob die Signaturen übereinstimmen oder nicht.
Den eigenen Code angreifen
Sie können versuchen, ein wenig zu hacken, indem Sie Anfragen an Ihre lokale Entwicklungsplattform erfassen mit Ngrokaufzeichnen, die Daten erfassen und versuchen, Webhooks mit einem HTTP-Client wie Postman an Ihre Anwendung zu senden. Wenn Sie irgendein Feld ändern - die Nachricht, die Telefonnummer, den Zeitstempel - schlägt der Signaturabgleich fehl.
Sichere eingehende Webhooks sicherstellen
Bei herkömmlichen Web Applications gibt es Session/Cookie-Informationen, CSRF-Tokens und andere Maßnahmen zum Schutz vor bösartigen eingehenden Daten. Webhooks haben nicht den gleichen Kontext und daher kann ein Ansatz wie ein gemeinsames Geheimnis mit einer Nachrichtensignatur vor Timing-Angriffen und eingehenden Daten schützen, die entweder manipuliert wurden oder von einem anderen Ort als den Servern von Vonage stammen. Meiner Erfahrung nach handelt es sich bei den meisten "bösartigen" Daten nur darum, dass jemand irgendwo die falsche URL eingegeben hat oder etwas ähnlich Harmloses. Unabhängig davon, ob es sich um einen Angriff handelt oder nicht, führt dies immer noch zu Daten, die Ihre Anwendung nicht verarbeiten sollte.
Nehmen Sie sich die Zeit, die Signaturen auf Ihrem Vonage Account zu aktivieren und den Prüfcode hinzuzufügen, sichere Applications sind glückliche Applications :)