PHP Создать подпись HMAC-SHA1

Это сводит меня с ума.

Я пытаюсь создать подпись, как предлагается здесь: 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=

Я перепробовал все, даже поменял местами с прямого на прямой. Ничего такого.

Что не так??? :(


person Anonymous    schedule 13.05.2016    source источник
comment
Попробовать наоборот? $ подпись = base64_encode (hash_hmac (sha1, $ apiKey, $ signature, true));   -  person Bas van Stein    schedule 13.05.2016
comment
@BasvanStein, что ты имеешь в виду?   -  person Anonymous    schedule 13.05.2016
comment
Чтобы изменить 2-й и 3-й параметр функции hash_hmac. Итак, чтобы хешировать подпись вместо ключа.   -  person Bas van Stein    schedule 13.05.2016
comment
@BasvanStein ничего   -  person Anonymous    schedule 13.05.2016


Ответы (2)


Я боролся с той же проблемой; решение размещено здесь Под другим вопросом.

Проблема в том, что строковый ключ (GUID) требует обратного порядка двухзначных шестнадцатеричных чисел в первых трех сегментах (http://msdn.microsoft.com/en-us/library/system.guid.tobytearray.aspx).

Пример создания хеша (используя указанный выше ключ):

$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));

В результате будет получен хэш, соответствующий хэшу из проверки подписи.

person Egg    schedule 11.11.2017

для sha1 нужна только функция hash_hmac

     hash_hmac('sha1', $inputText, $keyString)
person Rubén Ruíz    schedule 07.03.2019