Я провел последние 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')