如何让PHP生成类似Objective-C的HMAC-SHA1字符串?

11

我正在尝试使用PHP和Objective-C实现身份验证解决方案。两种语言都使用相同的密钥和相同的秘密创建自己的HMAC-SHA1编码字符串。

显然它们似乎在处理方式上有所不同。

在Objective-C侧,我正在使用OAuthCustomer作为签名类,它生成正确的编码字符串:

/3n/d4sKN6k3I7nBm1qau59UukU=

在 PHP 方面,我使用内置的函数 hash_hmac('sha1',...) 进行哈希处理,加上 base64 编码后会产生这样的结果:

ZmY3OWZmNzc4YjBhMzdhOTM3MjNiOWMxOWI1YTlhYmI5ZjU0YmE0NQ==

我接着尝试使用另一个函数 (在这里提到),并且这个函数使用base64编码之后会生成以下内容:

NWY1ODUwOWE3NGI4NWU5ZTIxMDYzMTNmNzk3NTYxMDQ4OWE1MmUzNQ==

我完全不知道如何解决这个问题,也不知道为什么会发生这种情况。

非常感谢帮助,

Paul


3
hash_hmac()的输出是一个十六进制字符串。你已经对该十六进制字符串进行了base64编码,这可能是不正确的。首先将hash_hmac函数的第四个参数设置为true。 - mario
谢谢。我已经更改了它,但输出并没有真正不同(密钥和密码是动态的,所以它们有点变化):N2ZmYWNlZjc2YjYwZGIzMzA0ZjBmMDhiNDhkMzUyNTJhYjViYTY1Nw== - Paul
不,你没有。解码后仍然是十六进制字符串。 - mario
你真是个天才。我将md5函数的第三个值改为true,因为我错过了一个括号。现在它按照预期工作了。谢谢! :) - Paul
@mario:将其变成答案,获取一些分数! - President James K. Polk
@GregS:圣诞懒惰。还有:你比我只多了三分!:} - mario
1个回答

29

好的,我会添加一个伪答案。(在Stackoverflow上每个问题都应该有一个回答。)

PHP中的哈希函数大多返回十六进制字符串而不是真实数据。(出于某种原因)通常会有一个函数参数,使其与其他实现兼容:

 hash_hmac("sha1", $data, $key, $raw_output=TRUE);

 md5($str, $raw_output=TRUE);

 hash("sha1", $data, $raw_output=TRUE);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接