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

发布于 2024-09-07 16:48:16 字数 822 浏览 8 评论 0原文

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

I'm trying to setup some Google Maps Premier API action, and to do so, I need to sign my URLs to authenticate. If you go down to Signature examples, there is some Python, C# and Java code to show you how to do the signature via HMAC-SHA1. There is also an example so that I can to test my PHP implementation. However, I just can't seem to get it to work.

Here's my 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=";

When, I run this, I get a signature of:

ZDRlNGMwZjIyMTA1MWM1Zjk0Nzc4M2NkYjlmNDQzNDBkYzk4NDI4Zg==

Which totally doesn't match.

Things I have thought about:

  1. The key is in Modified URL encoded format, so changing - and _ to + and / also doesn't work
  2. The Python example code does indeed work, so this is a valid example.
  3. Completely rewriting our code-base in python instead of PHP (I inherited it).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

生寂 2024-09-14 16:48:27

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

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

I assume your trying to sign the url for OAuth?

Try out this library: http://code.google.com/p/oauth/

黑寡妇 2024-09-14 16:48: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), '+/', '-_');

You have 2 problems at least,

  1. The Google uses special URL-safe Base64. Normal base64_decode doesn't work.
  2. You need to generate the SHA1 in binary.

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), '+/', '-_');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文