2010-06-26 14 views
9
digital zu signieren.

Ich versuche, einige Google Maps Premier-API-Aktion einzurichten, und ich muss meine URLs zur Authentifizierung signieren. Wenn Sie zu Signature-Beispielen gehen, gibt es Python-, C# - und Java-Code, um Ihnen zu zeigen, wie Sie die Signatur über HMAC-SHA1 erstellen. Es gibt auch ein Beispiel, damit ich meine PHP-Implementierung testen kann. Aber ich kann es einfach nicht funktionieren lassen.Ich versuche, über HMAC-SHA1 mit PHP

Hier ist mein Code:

$key = "vNIXE0xscrmjlyV-12Nj_BvUPaw="; 

$data = "/maps/api/geocode/json?address=New+York&sensor=false&client=clientID"; 

$my_sign = hash_hmac("sha1", $data, base64_decode($key)); 
$my_sign = base64_encode($my_sign); 

$valid_sign = "KrU1TzVQM7Ur0i8i7K3huiw3MsA="; 

Wenn ich dieses laufen lasse, erhalte ich eine Signatur von:

ZDRlNGMwZjIyMTA1MWM1Zjk0Nzc4M2NkYjlmNDQzNDBkYzk4NDI4Zg== 

die völlig stimmt nicht überein.

Dinge, die ich habe daran gedacht:

  1. Der Schlüssel in Modified URL codierten Format ist, so - und _-+ und / ändert sich auch nicht funktionieren
  2. Der Python Beispielcode funktioniert tatsächlich funktioniert, Das ist also ein gültiges Beispiel.
  3. Komplette Überarbeitung unserer Code-Basis in Python anstelle von PHP (ich erbte es).

Antwort

20

Sie haben zwei Probleme zumindest

  1. Die Google spezielle URL-safe Base64 verwendet. Normaler base64_decode funktioniert nicht.
  2. Sie müssen den SHA1 im Binärformat generieren.

Try this,

$key = "vNIXE0xscrmjlyV-12Nj_BvUPaw="; 
$data = "/maps/api/geocode/json?address=New+York&sensor=false&client=clientID"; 
$my_sign = hash_hmac("sha1", $data, base64_decode(strtr($key, '-_', '+/')), true); 
$my_sign = strtr(base64_encode($my_sign), '+/', '-_'); 
+0

Ihr Code arbeitete zur Verfügung. Ich schwöre, dass ich versucht habe, diese beiden Zeichen manuell umzuschalten und trotzdem das korrekte Ergebnis nicht sehen konnte. Vielleicht war das aber nicht korrekt. In jedem Fall, vielen Dank für Ihre Hilfe! :) – Conradaroma

+4

@ZZCoder Ihr Beispiel war noch heute nützlich - danke fürs Schreiben; das Signieren von Amazon S3-Bucket-Anforderungen ist sehr ähnlich. $ signature = rawurlencode (base64_encode (hash_hmac ("sha1", $ stringToSign, $ secret_access_key, true))); ' –

+0

Der Vorschlag von Geek Stocks für S3-Uploads funktioniert, wenn die rawurlencode-Funktion nicht verwendet wird. Diese Upload-Lösung hat gute S3/PHP-Informationen, die verwendet werden können, ohne jemals ihre Bibliothek zu verwenden: http://www.plupload.com/docs/v2/Upload-to-Amazon-S3 – Exit

Verwandte Themen