PHP:如何生成字符串的hmac SHA1签名?

Kyl*_*son 3 php hmac hmacsha1

我正在尝试使用PHP连接到API,并且需要正确的签名。

他们的文件逐字记录:

需要使用HMAC SHA-1哈希算法针对API密钥对命令字符串进行哈希处理。生成的字节数组应采用UTF-8格式进行Base64编码,以便可以通过http进行传递。

要生成签名,您必须使用小写的请求参数的完整列表,并通过每个字段-值对的字段按字母顺序对它们进行排序。使用秘密密钥VDaACYb0LV9eNjTetIOElcVQkvJck_J_QljX从前面的示例中签名的结果字符串为:

apikey = mivr6x7u6bn_sdahobpjnejpgest35exqjb8cg20&command = deployvirtualmachine&serviceofferingid = 21624abb-764e-4def-81d7-9fc54b5957fb&templateid = 54c83a5e-c548-4d91-8b14-5cf7d4b79b99b7c7d4b79b7c7d4b7c7d7b7c7d4b3df1c7d4b1e7b7e7b7b4e8b9c5bfbfbfb5c5bfbfc5bfc5bfbfc5bfc5bfc5bfc5bfc5bfc5bfc5bfbf5bfbf5bf5bf5bf5bf5bf5bf1b1b1b1b1b1b1b1b1b1b1b1b1b1b1bc

导致签名值为:

ahlpA6J1Fq6OYI1HFrMSGgBt0WY%3D

尝试示例:

$string = 'apikey=mivr6x7u6bn_sdahobpjnejpgest35exqjb8cg20&command=deployvirtualmachine&serviceofferingid=21624abb-764e-4def-81d7-9fc54b5957fb&templateid=54c83a5e-c548-4d91-8b14-5cf2d4c081ee&zoneid=1128bd56-b4d9-4ac6-a7b9-c715b187ce11
';
$string = utf8_encode(strtolower($string));
$key = 'VDaACYb0LV9eNjTetIOElcVQkvJck_J_QljX';
$signature = hash_hmac('sha1', $string , $key);
print 'SIGNATURE:'.$signature.'<br>';
if($signature=='ahlpA6J1Fq6OYI1HFrMSGgBt0WY%3D'){
    print 'SUCCESS';
}else{
    print 'FAIL';
}
Run Code Online (Sandbox Code Playgroud)

结果: 9077d90baa7ab8913811b64a50814b640dce60eb

假设是:ahlpA6J1Fq6OYI1HFrMSGgBt0WY%3D

问题:结果与他们的文档不匹配。知道我做错了什么吗?

kuh*_*han 5

您的签名应该这样生成:

$signature = urlencode(base64_encode(hash_hmac('sha1', $string , $key, true)));
Run Code Online (Sandbox Code Playgroud)

最后一个参数的默认值为false。然后,它将返回一个十六进制编码的字符串,而不是原始字节。然后,您必须按照文档中的说明对字节进行base64_encode。然后,您必须对其进行urlencode,因为=必须对其进行转换