Почему HMAC sha256 возвращает другое значение в PHP & amp; Javascript

Я пытаюсь построить строку HMAC SHA256 в Javascript, используя CryptoJS, мой существующий код написан на PHP с использованием библиотеки Akamai.

В некоторых случаях я получаю разные результаты по сравнению с PHP & Я не могу понять, почему это дает мне разные результаты

    /*
<php> Using native hash_hmac
Generating key by concatenating char
*/

$signature1 = hash_hmac('SHA256', "st=1453362060~exp=1453363260~acl=/*", chr(63));
$signature2 = hash_hmac('SHA256', "st=1453362060~exp=1453363260~acl=/*", chr(63) . chr(23));
$signature3 = hash_hmac('SHA256', "st=1453362060~exp=1453363260~acl=/*", chr(63) . chr(23) . chr(253));

/*
here is result from php
signature1 : 3e086bb48ab9aafa85661f9ce1b7dac49befddf117ce2a42d93c92b6abe513ce ( matched: same as JavaScript)
signature2 : 3667dd414a50f68f7ce083e540f27f68f7d0f18617b1fb1e4788bffeaeab59f6( matched: same as JavaScript)
signature3 : dd5a20041661046fdee871c8b9e77b3190fbbf85937c098090a1d524719b6aa9 ( not matched: diff from JavaScript)
*//*
<JavaScript> using CryptoJS
Generating key by concatenating three char
*/

var signature1 = CryptoJS.HmacSHA256("st=1453362060~exp=1453363260~acl=/*", String.fromCharCode(63));
var signature2 = CryptoJS.HmacSHA256("st=1453362060~exp=1453363260~acl=/*", String.fromCharCode(63) + String.fromCharCode(23));
var signature3 = CryptoJS.HmacSHA256("st=1453362060~exp=1453363260~acl=/*", String.fromCharCode(63) + String.fromCharCode(23) + String.fromCharCode(253));

/*
here is result from JavaScript
signature1 : 3e086bb48ab9aafa85661f9ce1b7dac49befddf117ce2a42d93c92b6abe513ce ( matched: same as php)
signature2 : 3667dd414a50f68f7ce083e540f27f68f7d0f18617b1fb1e4788bffeaeab59f6 ( matched: same as php)
signature3 : 28075dc75de9f22f83e87772f09a89efb007f2e298167686832eff122ef6eb08 ( not matched: diff from php)
*/

Первые два значения HMAC совпадают, но когда я добавляю третий символ, он дает разные результаты. Может кто-нибудь объяснить, почему это так.

здесь
PHPFiddle &
JSFiddle

3

Решение

CryptoJS добавляет кодировку UTF8 в «Ключ» при создании хэша sha256, так что мы получаем другое значение.

Если я заверну utf8_encode в сторону PHP, мы получим то же значение hmac, что и в JavaScript

     // <php>
$key = chr(63) . chr(23) . chr(253);
signature3 = hash_hmac('SHA256', "st=1453362060~exp=1453363260~acl=/*", utf8_encode($key));
2

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

Других решений пока нет …