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

尝试使用PHP通过HMAC-SHA1进行数字签名,php,hmacsha1,Php,Hmacsha1,我正在尝试设置一些GoogleMapsPremierAPI操作,为此,我需要对我的URL进行签名以进行身份验证。如果你看签名示例,有一些Python、C#和Java代码向你展示了如何通过HMAC-SHA1进行签名。还有一个例子,我可以用来测试我的PHP实现。然而,我似乎无法让它发挥作用 这是我的密码: $key = "vNIXE0xscrmjlyV-12Nj_BvUPaw="; $data = "/maps/api/geocode/json?address=New+York&senso

我正在尝试设置一些GoogleMapsPremierAPI操作,为此,我需要对我的URL进行签名以进行身份验证。如果你看签名示例,有一些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==
这完全不匹配

我想到的事情:

  • 密钥采用修改后的URL编码格式,因此将
    -
    -
    更改为
    +
    /
    也不起作用
  • Python示例代码确实有效,因此这是一个有效的示例
  • 完全用python而不是PHP重写我们的代码库(我继承了它)

  • 我猜你是想为OAuth的url签名


    尝试此库:

    您至少有两个问题

  • 谷歌使用特殊的URL安全Base64。正常的base64_解码不起作用
  • 您需要以二进制形式生成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), '+/', '-_');
    

    php示例可在

    中找到,您的代码运行正常。我发誓我试图手动切换这两个字符,但仍然看不到正确的结果。也许这是不正确的。无论如何,谢谢你的帮助!:)@ZZCoder您的示例在今天仍然很有用-感谢您编写它;签署AmazonS3 bucket请求非常相似<代码>$signature=rawurlencode(base64_编码(hash_hmac(“sha1”),$stringToSign,$secret_access_key,true))Geek Stocks建议S3上传在不使用rawurlencode函数时有效。这个上传解决方案有很好的S3/PHP信息,可以在不使用其库的情况下使用:也可以使用Google静态地图等。