【问题标题】:PHP Generate HMAC-SHA1 signaturePHP 生成 HMAC-SHA1 签名
【发布时间】:2016-05-13 10:08:50
【问题描述】:

这快把我逼疯了。

我正在尝试按照此处的建议生成签名:https://www.reed.co.uk/developers/SignatureTest

这边:

function createSignature($queryUrl, $timestamp, $apiKey, $http = "GET", $agent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"){
    $signature = $http . $agent . $queryUrl . "www.reed.co.uk" . $timestamp;
    $signature = base64_encode(hash_hmac("sha1", $signature, $apiKey, true));
    return $signature;
}


$clientId = 1;
$timestamp = "2016-05-13T09:22:50Z";

$apiKey = "bacd2d2d-8b69-43c8-94c5-4a24c0269b79";

$queryUrl = "https://www.reed.co.uk/recruiter/api/1.0/cvsearch";

$reedQuery = \Httpful\Request::get($queryUrl)
    ->addHeaders(array(
        "X-ApiSignature" => createSignature($queryUrl, $timestamp, $apiKey),
        "X-ApiClientId" => $clientId,
        "X-TimeStamp" => $timestamp
    ))
    ->expectsJson()
    ->send();


print_r($reedQuery);

现在由于某些原因它在我的服务器上返回:WRTjqQKfyEQyLJEzWWuT3SWgGPk= 而预期的结果是:JUgvCh5oeFYe1HDmfiMObOu1+nQ=

我尝试了一切,甚至从小端切换到大端。 什么都没有。

怎么了??? :(

【问题讨论】:

  • 换一种方式试试? $signature = base64_encode(hash_hmac("sha1", $apiKey, $signature, true));
  • @BasvanStein 你是什么意思?
  • 对hash_hmac函数的第2个和第3个参数进行翻转。所以要散列签名而不是密钥。
  • @BasvanStein 什么都没有

标签: php hmacsha1


【解决方案1】:

我在同样的问题上苦苦挣扎;解决方案是 posted here 在另一个问题下。

问题是字符串键 (GUID) 需要在前 3 段 (http://msdn.microsoft.com/en-us/library/system.guid.tobytearray.aspx) 中反转 2 个字符的十六进制数字的顺序。

创建哈希的示例(使用上面的密钥):

$apiToken = 'bacd2d2d-8b69-43c8-94c5-4a24c0269b79';
$stringToSign = 'POSTReedAgenthttps://www.reed.co.uk/recruiter/api/1.0/jobswww.reed.co.uk2017-11-11T13:50:06+00:00';
$hexStr = str_replace('-','',$apiToken);
$c = explode('-',chunk_split($hexStr,2,'-'));
$hexArr = array($c[3],$c[2],$c[1],$c[0],$c[5],$c[4],$c[7],$c[6],$c[8],$c[9],$c[10],$c[11],$c[12],$c[13],$c[14],$c[15]);
$keyStr = '';
for ($i = 0; $i < 16; ++$i) {
    $num = hexdec($hexArr[$i]);
    $keyStr .= chr($num);
}
$apiSignature = base64_encode(hash_hmac('sha1',$stringToSign,$keyStr,true));

这会产生一个与Signature Test 匹配的哈希。

【讨论】:

    【解决方案2】:

    对于 sha1 只需要 hash_hmac 函数

         hash_hmac('sha1', $inputText, $keyString)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      相关资源
      最近更新 更多