hmac — Хеши не похожи между PHP и PEST REST Client

Я создаю HMAC API и у меня возникают проблемы с тестированием хэширования с помощью Paw.

На Лапе у меня есть эта полезная нагрузка:

GET:/hello/world:"":9a6e30f2016370b6f2dcfb6880501d7f2305d69bout

и пользовательская переменная HMAC-SHA256 (фактически функция как это это устанавливает его в заголовке X-Hash.

X-Hash: 4Cq2yehWumDcUk1dYyfhm6qWjJVBkOCB8o12f5l0WGE=

В моем PHP API у меня есть то же самое:

GET:/hello/world:"":9a6e30f2016370b6f2dcfb6880501d7f2305d69bout

и использовал:

hash_hmac('sha256', $this->getPayload(), '9a6e30f2016370b6f2dcfb6880501d7f2305d69bout', false);

Итак, при сравнении хешей:

Paw: 4Cq2yehWumDcUk1dYyfhm6qWjJVBkOCB8o12f5l0WGE=
PHP: 6961b9d1f6e986c49d963cbebd691fa68dfa59b4ce3b7f05320c2d43eae3c7c3

Они очень разные. Любая идея, почему это?

Обновить

Код лапы:

function evaluate(context){
var loc = getLocation(context.getCurrentRequest().url);

var payload = "";
payload += context.getCurrentRequest().method + ':';
payload += loc.pathname + ':';
payload += JSON.stringify(context.getCurrentRequest().body) + ':';
payload += "9a6e30f2016370b6f2dcfb6880501d7f2305d69bout"; // Private key
return payload;
};

function getLocation(href) {
var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)(\/[^?#]*)(\?[^#]*|)(#.*|)$/);
return match && {
protocol: match[1],
host: match[2],
hostname: match[3],
port: match[4],
pathname: match[5],
search: match[6],
hash: match[7]
}
}

PHP-код (с большим количеством комментариев):

if (strpos(strtoupper($authHeader), 'HMAC') !== 0) {
echo 'out';
throw new HttpForbiddenException();
}
else {
$hmacSignature = $app->request->headers()->get('X-Hash');
$publicKey = $app->request->headers()->get('X-Public');

if ( empty($hmacSignature) || empty($publicKey) ) {
echo 'out2';
throw new HttpForbiddenException();
}
else {

$this->hmacManager->setPublicKey($publicKey);
print '$publickey = ' . $publicKey . '<br>';

// Validate if base64_encoded or not
if( base64_decode($hmacSignature, true) !== FALSE ) {
$binaryString = base64_decode($hmacSignature);
$hmacSignature = bin2hex($binaryString);
print 'decoding ' . '<br>';
}
$this->hmacManager->setHmacSignature($hmacSignature);
print '$hmacSignature = ' . $hmacSignature . '<br>';

$this->hmacManager->setRequestMethod($app->request->getMethod());
print 'method = ' . $app->request->getMethod() . '<br>';
$this->hmacManager->setRequestResourceUri($app->request->getResourceUri());
print 'uri = ' . $app->request->getResourceUri() . '<br>';

$requestBody = $app->request()->getBody();
if (Utils::isJson($requestBody)) {
$requestBody = json_decode($requestBody);
}
$this->hmacManager->setRequestBody(json_encode($requestBody));
print 'body = ' . json_encode($requestBody) . '<br>';

print 'private key = ' . $this->hmacManager->getPrivateKey() . '<br>';

$payload = '';
$payload .= $this->hmacManager->getRequestMethod() . ":";
$payload .= $this->hmacManager->getRequestResourceUri() . ":";
$payload .= $this->hmacManager->getRequestBody() . ":";
$payload .= $this->hmacManager->getPrivateKey();
print 'PHP payload [' . $payload . ']';
$this->hmacManager->setPayload($payload);

$hmacValue = $this->hmacManager->generateHmac();
$isValid = $this->hmacManager->isValid($this->hmacManager->generateHmac(), $hmacSignature);

if ($isValid !== true) {
echo 'out3';
throw new HttpForbiddenException();
}
}
}

generateHmac из другого класса:

public function generateHmac()
{
print 'Generating HMAC' . '<br>';
$algorithm = $this->getAlgorithm();
print 'algo ' . $algorithm . '<br>';
$privateKey = $this->getPrivateKey();
print 'privk ' . $privateKey . '<br>';

if (empty($algorithm)) {
throw new \RuntimeException('Algorithm must be set and not empty');
} elseif (empty($privateKey)) {
throw new \RuntimeException('Private key must be set and not empty');
}

print 'payload ' . $this->getPayload() . '<br>';
$hash = hash_hmac($this->getAlgorithm(), $this->getPayload(), $this->getPrivateKey(), false);
print 'php hasj: ' . $hash . '<br>';

return $hash;
}

Наконец, вот выходные выражения:

$publickey = 95f97b93560f951b4cae46c86d03d9b1a81d4ae8
decoding
$hmacSignature = e02ab6c9e856ba60dc524d5d6327e19baa968c954190e081f28d767f99745861

method = GET
uri = /hello/world
body = ""private key = 9a6e30f2016370b6f2dcfb6880501d7f2305d69bout
PHP payload [GET:/hello/world:"":9a6e30f2016370b6f2dcfb6880501d7f2305d69bout]

Generating HMAC
algo sha256
privk 9a6e30f2016370b6f2dcfb6880501d7f2305d69bout
payload GET:/hello/world:"":9a6e30f2016370b6f2dcfb6880501d7f2305d69bout
php hash: 6961b9d1f6e986c49d963cbebd691fa68dfa59b4ce3b7f05320c2d43eae3c7c3

Надеюсь, поможет!

5

Решение

Хеш paw кодируется в base64, а PHP — в шестнадцатеричном. Итак, сначала расшифруем хеш лапы:

$binary = base64_decode($pawHash);
$hex = bin2hex($binary);

А затем сравните это с вашим собственным хешем.

4

Другие решения

Мы только что добавили новый Динамические значения преобразования Base 64 в Hex, это должно решить вашу проблему.

Оберните динамическое значение подписи HMAC внутри нового Base 64 в шестнадцатеричное, и вы получите действительную шестнадцатеричную подпись:

Шестнадцатеричная подпись HMAC с Paw

Вы можете установить это новое динамическое значение здесь: Base 64 to Hex Динамическое значение

2

По вопросам рекламы [email protected]