Вычислите дайджест HMAC-SHA256 в ColdFusion с использованием Java

StackOverflow https://stackoverflow.com/questions/951477

Вопрос

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

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

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

Это было полезно?

Решение

Это то, что я в конечном итоге сделал:

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());

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

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

Вот пример ответа 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")>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top