Попытка цифровой подписи через HMAC-SHA1 с PHP - PullRequest
9 голосов
/ 27 июня 2010

Я пытаюсь настроить некоторые действия API Карт Google Premier, и для этого мне нужно подписать свои URL-адреса для аутентификации.Если вы перейдете к примерам Signature, есть немного кода на Python, C # и Java, чтобы показать вам, как сделать подпись через HMAC-SHA1.Есть также пример, чтобы я мог проверить мою реализацию PHP.Тем не менее, я просто не могу заставить его работать.

Вот мой код:

$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=";

Когда я запускаю это, я получаю подпись:

ZDRlNGMwZjIyMTA1MWM1Zjk0Nzc4M2NkYjlmNDQzNDBkYzk4NDI4Zg==

, что полностью не соответствует.

Вещи, о которых я думал:

  1. Ключ находится в кодированном формате измененного URL, поэтому изменение - и _ на + и / также не 't work
  2. Пример кода Python действительно работает, так что это верный пример.
  3. Полностью переписываем нашу базу кода на python вместо PHP (я унаследовал его).

Ответы [ 3 ]

21 голосов
/ 27 июня 2010

У вас есть как минимум 2 проблемы,

  1. Google использует специальный URL-безопасный Base64.Обычный base64_decode не работает.
  2. Вам необходимо сгенерировать SHA1 в двоичном формате.

Попробуйте это,

$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), '+/', '-_');
3 голосов
/ 26 апреля 2012
0 голосов
/ 27 июня 2010

Я предполагаю, что вы пытаетесь подписать URL для OAuth?

Попробуйте эту библиотеку: http://code.google.com/p/oauth/

...