Невозможно сопоставить результаты php hash_hmac() и coldfusion hmac()

Я работаю над шифрованием URL-адреса и преобразованием рабочего скрипта из PHP в ColdFusion. Я выполнил 95% работы, но я застрял на этом этапе, попробовав множество решений, доступных на StackOverflow. Мои результаты все еще не совпадают. Я подтвердил, что значения saltBin и keyBin одинаковы в обоих скриптах. Пожалуйста, посмотрите.

PHP-версия

$saltBin = R�k��E�x^ �O<�-�7J=S�z��� �;
$keyBin = �;B��|� �0U,��h�NS+��.��G���

res = hash_hmac('sha256', $saltBin, $keyBin);
result
39ddcd6156a30fdcebc9fbf5dd59a0ef4f47e27841bbc12ce72b64a0a63c0324

Версия для холодного синтеза

<cfset res = hmac(saltBin,keyBin,"HMACSHA256")>
result
30A658BEB3965C2D7D27A3F717FB6C13B05ED44E8B2A5A7FEBB9B57887CF57A0

Я пробовал следующие решения

ColdFusion эквивалент PHP hash_hmac

Хеширование coldfusion и разница между hmacSHA256 и SHA256

Обновлять:

Ниже приведена сокращенная версия PHP-версия.

$key = '943b421c9eb07c830af81030552c86009268de4e532ba2ee2eab8247c6da0881';
$salt = '520f986b998545b4785e0defbc4f3c1203f22de2374a3d53cb7a7fe9fea309c5';
$keyBin = pack("H*" , $key);
$saltBin = pack("H*" , $salt);
$path = "/rs:fill:300:300:1/g:no/aHR0cDovL2ltZy5leGFtcGxlLmNvbS9wcmV0dHkvaW1hZ2UuanBn.png";
echo hash_hmac('sha256', $saltBin.$path, $keyBin);

Результат: 7062c2b5786c82de963767de4b0cdbc4e7ed7db2ce7466708bf8a28d8572888b

Версия ColdFusion

<cfset key = '943b421c9eb07c830af81030552c86009268de4e532ba2ee2eab8247c6da0881'>
<cfset salt = '520f986b998545b4785e0defbc4f3c1203f22de2374a3d53cb7a7fe9fea309c5'>
<cfset keyBin = binaryDecode(key, 'hex')>  
<cfset keyBin =  toString(keyBin)>
<cfset saltBin = binaryDecode(salt, 'hex')>  
<cfset saltBin =  toString(saltBin)>
<cfset path =  "/rs:fill:300:300:1/g:no/aHR0cDovL2ltZy5leGFtcGxlLmNvbS9wcmV0dHkvaW1hZ2UuanBn.png">
<cfset result = hmac(saltBin&path,keyBin,"HMACSHA256")>
<cfoutput>#result#</cfoutput>

Результат: FFA7A526BB464CA1470F309605F1ED63832342B704F8475BFAF26CCD1092603B

Может ли кто-нибудь помочь мне в этом отношении?

Спасибо.

Нам нужно увидеть код, показывающий, как на самом деле заполняются $saltBin и $keyBin. Кроме того, при работе с двоичным кодом лучше размещать значения в виде строк в кодировке base64 base64_encode. Каково кодированное в base64 значение $saltBin и $keyBin?

SOS 09.05.2022 16:51

@SOS Я добавил полные сценарии в ссылки в конце вопроса. Пожалуйста, проверьте.

dev 09.05.2022 18:09

См. stackoverflow.com/a/66079528/2645359

AndreasRu 09.05.2022 19:50

Понятия не имею, почему кто-то проголосовал за закрытие этого вопроса как «Поиск рекомендаций по книгам, инструментам, программным библиотекам и т. д.». Это явно о конкретной проблеме с кодом, с примерами кода и результатами.

SOS 10.05.2022 04:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

saltBin and keyBin values are the same on both scripts

Да, эти значения совпадают, но данные хэшируется иначе. Поэтому результаты не совпадают.

PHP-код хеширует конкатенированные бинарный переменных соли и пути. Чтобы проиллюстрировать использование простых значений:

ДанныеЦенностьБинарныйBase64
Сольаб[-85]qw==
Дорожка123[49,50,51]МТИз
Соль + Путьн/д[-85,49,50,51]qzEyMw==

В то время как код CF использует двоичный файл конкатенированной соли и пути струны, после некоторого очень... сомнительного перекодирования с помощью Нанизывать(). Как видите, полученный двоичный файл сильно отличается от того, что используется в php:

ДанныеЦенностьБинарныйBase64
Соль[-17,-65,-67]77+9
Дорожка123[49,50,51]МТИз
Соль + Путь �123[-17,-65,-67,49,50,51]77+9МТИз

Код CF должен объединить бинарный двух переменных. Затем передайте этот двоичный файл функции хмак():

CF (см. работающий пример)

<cfscript>
   key = '943b421c9eb07c830af81030552c86009268de4e532ba2ee2eab8247c6da0881';
   salt = '520f986b998545b4785e0defbc4f3c1203f22de2374a3d53cb7a7fe9fea309c5';
   keyBin =  binaryDecode(key, "hex");
   saltBin = binaryDecode(salt, "hex");
   path = "/rs:fill:300:300:1/g:no/aHR0cDovL2ltZy5leGFtcGxlLmNvbS9wcmV0dHkvaW1hZ2UuanBn.png";
   pathBin = charsetDecode(path, "utf-8");

   // merge binary of salt and path
   combined = [];
   combined.append(saltBin, true);
   combined.append(pathBin, true);
   result = lcase(hmac( javacast("byte[]", combined),keyBin,"HMACSHA256"));
   writeDump(result);
</cfscript>

Результат:7062c2b5786c82de963767de4b0cdbc4e7ed7db2ce7466708bf8a28d8572888b

PHP (см. работающий пример)

<?php
$key = '943b421c9eb07c830af81030552c86009268de4e532ba2ee2eab8247c6da0881';
$salt = '520f986b998545b4785e0defbc4f3c1203f22de2374a3d53cb7a7fe9fea309c5';
$keyBin = pack("H*" , $key);
$saltBin = pack("H*" , $salt);
$path = "/rs:fill:300:300:1/g:no/aHR0cDovL2ltZy5leGFtcGxlLmNvbS9wcmV0dHkvaW1hZ2UuanBn.png";
echo hash_hmac('sha256', $saltBin.$path, $keyBin);

Результат:7062c2b5786c82de963767de4b0cdbc4e7ed7db2ce7466708bf8a28d8572888b

Замечательный и хорошо объясненный ответ! Заслуживает больше, чем один голос!

AndreasRu 12.05.2022 02:42

@SOS Большое спасибо. Вы сэкономили мое время и силы и решили проблему. Отличное объяснение и замечательный ответ. Я применил ваше решение, и оно работает как шарм. Большой!!!

dev 12.05.2022 12:31

Другие вопросы по теме