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

Con*_*oma 9 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=";
Run Code Online (Sandbox Code Playgroud)

什么时候,我运行这个,我得到一个签名:

ZDRlNGMwZjIyMTA1MWM1Zjk0Nzc4M2NkYjlmNDQzNDBkYzk4NDI4Zg==
Run Code Online (Sandbox Code Playgroud)

哪个完全不匹配.

我想过的事情:

  1. 关键是在修改URL编码格式,因此在改变-_+/也不起作用
  2. Python示例代码确实有效,因此这是一个有效的示例.
  3. 完全用python而不是PHP重写我们的代码库(我继承了它).

ZZ *_*der 21

你至少有两个问题,

  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), '+/', '-_');
Run Code Online (Sandbox Code Playgroud)

  • @ZZCoder你的例子今天仍然有用 - 感谢写作; 签署Amazon S3存储桶请求非常相似.`$ signature = rawurlencode(base64_encode(hash_hmac("sha1",$ stringToSign,$ secret_access_key,true)));` (4认同)

Ken*_*ins 0

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

尝试这个库: http: //code.google.com/p/oauth/