OpenSSL HMAC-SHA1 дайджест не соответствует Crypto's

Я провел последние 6 часов, выполняя алгоритм подписывания сообщений .. Он не работает ВСЕ:

Это PHP-код для генерации дайджеста:

$payload = "thisisanapple"; $signature = hash_hmac("sha1", $payload, "thisisarandomkey"); $data = base64_encode($signature); // YzExZWRmZDliMjQzNTZjNzhlNmE3ZTdmMDE3ODJjNmMxMmM4ZTllMQ== 

Это JS, запущенный на сервере Node.js, делает то же самое:

 var hmac = crypto.createHmac('sha1', "thisisarandomkey"); hmac.update("thisisanapple"); var signature = hmac.digest('base64'); // wR7f2bJDVseOan5/AXgsbBLI6eE= 

Я не знаю, что здесь не так. Я пытаюсь SHA256, но они все еще отличаются. Я также использовал закрытый ключ, сгенерированный с OpenSSL, как в обычном тексте, так и в base64, все тот же результат (разные ключи).

hash_hmac имеет четыре параметра, а последний указывает выход, и по умолчанию hash_hmac возвращает hash_hmac строку, а не необработанные данные. Поэтому base64_encode кодирует base64_encode строку в фрагменте кода PHP.

Это будет хорошо работать:

 $payload = "thisisanapple"; $signature = hash_hmac("sha1", $payload, "thisisarandomkey", true); $data = base64_encode($signature); // wR7f2bJDVseOan5/AXgsbBLI6eE= 

Если вы хотите дублировать поведение PHP в JS, вот код:

 hmac = crypto.createHmac('sha1', 'thisisarandomkey') signature = hmac.update('thisisanapple') data = new Buffer(hmac.digest('hex')).toString('base64')