Рассчитать дайджест HMAC-SHA256 в ColdFusion с помощью Java - PullRequest
5 голосов
/ 04 июня 2009

Мы пытаемся вычислить дайджест HMAC-SHA256 в ColdFusion, и мы используем CFC HMAC, но в одном случае он дает другой результат для дайджеста по сравнению с результатами, сгенерированными на разных языках - пробовали те же данные, используя Ruby & PHP и получите ожидаемый результат. Я также попробовал пользовательский тег CF_HMAC, на котором он основан, и получил те же результаты.

Я понимаю, что из CF8 encrypt() поддерживает HMAC-SHA256, но он доступен только в Enterprise (которого у нас нет) и даже недоступен в версии для разработчиков для тестирования.

Итак, мой вопрос, могу ли я сделать это, получив доступ к Java из CF?

Ответы [ 2 ]

11 голосов
/ 04 июня 2009

Вот что я закончил:

secret = createObject('java', 'javax.crypto.spec.SecretKeySpec' ).Init(my_key.GetBytes(), 'HmacSHA256');
mac = createObject('java', "javax.crypto.Mac");
mac = mac.getInstance("HmacSHA256");
mac.init(secret);
digest = mac.doFinal(my_data.GetBytes());

Это дает вам байтовый массив, который вы можете затем преобразовать в строку.

0 голосов
/ 25 сентября 2013

Вот пример ответа DEfusion с различными форматами ввода / вывода. Мой ключ шестнадцатеричный, мои данные ниже ascii (так будет делать UTF-8), и мне нужен вывод base64, поэтому я передаю соответствующие аргументы формата в BinaryDecode и CharsetDecode:

<cfset keybytes = BinaryDecode(SECRET_KEY, "Hex")>
<cfset databytes = CharsetDecode(data, "UTF-8")>
<cfset secret = createObject("java", "javax.crypto.spec.SecretKeySpec").Init(keybytes,"HmacSHA256")>
<cfset mac = createObject("java", "javax.crypto.Mac")>
<cfset mac = mac.getInstance("HmacSHA256")>
<cfset mac.init(secret)>
<cfset digest = mac.doFinal(databytes)>
<cfset result = BinaryEncode(digest, "Base64")>
...