2017-01-03 5 views
3

Я пытаюсь подражать функции PHP в ColdFusion Выход Php для следующего;.Coldfusion пакет (H * эквивалент

<?php echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', pack('H*','specialkey')))); ?> 

Результаты в E9C9E66592306F1BD27A3B1991C7650D4A8920D10E5FFDA955DA692225793F35

Когда попытка в CF

<cfset z=hmac("a cow jumps over the moom", "specialkey","HMACSHA256")> 

Результат 1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF

Это, очевидно, связано с pack(H* часть, как будто я бегу

<?php echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', 'specialkey'))); ?> 

В результате 1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF

Как эмулировать pack(H* в PHP? Мне нужно вернуть результат E9C9E66592306F1BD27A3B1991C7650D4A8920D10E5FFDA955DA692225793F35 в CF?

+0

Мы не можем помочь вам, если вы не используете какой-либо код. –

+0

Вам нужно указать тип данных 'what', который вы пытаетесь упаковать. Часть «H *» - это «как». Чтобы все было ясно: 'pack (how, what)' – Alex

+0

Извините, это вы имеете в виду? BrianL

ответ

4

Хотя может показаться, что обе стороны используют один и тот же ключ - это не так.

Для генерации HMAC и PHP и CF должны сначала декодировать значение в двоичный код, и это значение является тем, что фактически используется как «ключ». Причина, по которой вы получаете другой результат, заключается в том, что обе стороны декодируют значение ключа по-разному: PHP расшифровывает его с hexadecimal и CF как обычную строку с использованием JVM по умолчанию, то есть UTF-8, ASCII и т. Д. В результате PHP и CF генерируют совершенно разные ключи, поэтому коды HMAC не совпадают.

Сказав это, я заметил, что ваше ключевое значение «specialkey» на самом деле не является допустимой шестнадцатеричной строкой. Поэтому, прежде чем вы потратите много времени на это, мой вопрос будет заключаться в коде PHP действительно с использованием произвольных строк, таких как «specialkey», или это только для целей тестирования? Если реальный код использует действительные строки шестнадцатеричных, а затем просто передать ключ двоичный к функции HMAC CF и результаты должны быть такими же:

ColdFusion:

writeOutput(hmac("a cow jumps over the moom" 
      , binaryDecode("7370656369616c6b6579", "hex") 
      , "HMACSHA256")); 

PHP:

echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', pack('H*','7370656369616c6b6579')))); 

Результат:

1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF 

Update: Если по какой-то причине вы действительно должны использовать произвольные строки в качестве ключей, возьмите выглядеть Perl docs for pack (на котором основана функция PHP).

Отказ от ответственности: Я не являюсь парнем PHP, поэтому есть немного больше, но ... по существу pack(H*) разбивает вашу ключевую строку на пары символов и интерпретирует их как шестую.Недействительные символы, такие как "S", "р", "я", и так далее преобразуются в нуль или 0:

sp --> 00 ("s" and "p" are invalid) 
    ec --> EC ("e" and "c" are valid hex) 
    ia --> 0A ("i" is invalid, "a" is valid) 
    lk --> 00 ("l" and "k" are both invalid) 
    ey --> E0 ("e" is valid, "y" is invalid) 

Полученный бинарный это (в шестнадцатеричном формате):

00 EC 0A 00 E0 

Если вы декодировать шестнадцатеричную строку обратно в двоичный и использовать его в качестве ключа:

hmac("a cow jumps over the moom", binaryDecode("00EC0A00E0", "hex"), "HMACSHA256") 

CF возвращает тот же результат, как PHP:

E9C9E66592306F1BD27A3B1991C7650D4A8920D10E5FFDA955DA692225793F35 
+0

) Спасибо, я опустил двоичный код («00EC0A00E0», «hex »), Специальный ключ был всего лишь тестовым ключом. – BrianL