Я работаю над шифрованием 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
<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
Может ли кто-нибудь помочь мне в этом отношении?
Спасибо.
@SOS Я добавил полные сценарии в ссылки в конце вопроса. Пожалуйста, проверьте.
См. stackoverflow.com/a/66079528/2645359
Понятия не имею, почему кто-то проголосовал за закрытие этого вопроса как «Поиск рекомендаций по книгам, инструментам, программным библиотекам и т. д.». Это явно о конкретной проблеме с кодом, с примерами кода и результатами.
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
Замечательный и хорошо объясненный ответ! Заслуживает больше, чем один голос!
@SOS Большое спасибо. Вы сэкономили мое время и силы и решили проблему. Отличное объяснение и замечательный ответ. Я применил ваше решение, и оно работает как шарм. Большой!!!
Нам нужно увидеть код, показывающий, как на самом деле заполняются
$saltBin
и$keyBin
. Кроме того, при работе с двоичным кодом лучше размещать значения в виде строк в кодировке base64 base64_encode. Каково кодированное в base64 значение$saltBin
и$keyBin
?