尝试使用PHP通过HMAC-SHA1进行数字签名

时间:2010-06-26 20:30:18

标签: php hmacsha1

我正在尝试设置一些Google Maps Premier API操作,为此,我需要对我的网址进行身份验证。如果您查看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. 密钥采用经过修改的网址编码格式,因此将-_更改为+/也不起作用
  2. Python示例代码确实有效,因此这是一个有效的示例。
  3. 在python中完全重写我们的代码库而不是PHP(我继承了它)。

3 个答案:

答案 0 :(得分:21)

至少你有两个问题,

  1. Google使用特殊的URL安全Base64。普通的base64_decode不起作用。
  2. 您需要以二进制生成SHA1。
  3. 试试这个,

    $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), '+/', '-_');
    

答案 1 :(得分:3)

答案 2 :(得分:0)

我假设您尝试为OAuth签署网址?

试用此库:http://code.google.com/p/oauth/