Я пытаюсь имитировать это функциональность PHP
<?php
base64_encode( hash_hmac( 'SHA256', $a, $b, true) );
?>
Есть ли разница между «HmacSHA256» и «sha256»?
Это работает — но не дает мне тот же результат:
<cfscript>
toBase64( hmac( a, b, 'HmacSHA256', 'us-ascii' ) );
</cfscript>
это говорит мне, что «sha256» недоступен (потому что я не использую предприятие)
<cfscript>
toBase64( hmac( a, b, 'SHA256', 'us-ascii' ) );
</cfscript>
В любом случае я могу сделать это без предприятия? разве нет Java-библиотеки, которую я могу связать для кодирования?
Спасибо
Это общая версия того, что я недавно использовал. Не проверял этот точный код, но попробуй. Я храню зашифрованное значение SECRET_KEY
в базе данных, чтобы держать его вне кода приложения.
<cffunction name="HmacSHA256" access="public" output="false" returntype="string" hint="Generates HmacSHA256 string.">
<cfargument name="message" type="string" required="true" hint="form data" />
<cfset var HMAC_SHA256 = "HmacSHA256" />
<cfset var SECRET_KEY = "{YOUR_SECRET_KEY}" />
<cfset var secretKeySpec = createObject("java", "javax.crypto.spec.SecretKeySpec").init( SECRET_KEY.getBytes("UTF-8"), HMAC_SHA256 ) />
<cfset var mac = createObject("java", "javax.crypto.Mac").getInstance(HMAC_SHA256) />
<cfset mac.init( secretKeySpec ) />
<cfset var rawHmac = mac.doFinal( arguments.message.getBytes("UTF-8") ) />
<cfset var encoder = createObject("java", "sun.misc.BASE64Encoder") />
<cfreturn encoder.encodeBuffer(rawHmac).replace("\n", "").replace("\r", "") />
</cffunction>
CF документация для hmac
очень не хватает полезных деталей Причина, по которой ваш код не работает, состоит в том, что hmac()
возвращает шестнадцатеричную строку. Принимая во внимание, что вызов PHP hash-hmac
возвращает двоичный файл В результате ваш скрипт CF имеет кодировку base64 с совершенно другим значением. Вот почему два результата не совпадают.
Вам нужно сначала декодировать шестнадцатеричную строку в двоичную. Затем закодируйте двоичный как base64 и результаты будут соответствовать:
resultAsHex = hmac("Well done is better than well said.", "key", "HmacSHA256");
finalValue = binaryEncode( binaryDecode(resultAsHex, "hex"), "base64" );
writeDump( finalValue );
Как в сторону, toBase64()
устарела. Документы рекомендуют использовать binaryEncode
для новых приложений.
Похоже, вам придется установить библиотеки чтобы получить sha256
ColdFusion 10 представил функцию hmac () для генерации безопасных хешированных кодов аутентификации сообщений (HMAC). Эта функция делает работу со сторонними API намного проще. Однако до ColdFusion 10 вам нужно было углубиться в уровень Java, чтобы получить доступ к библиотекам безопасности. Этот компонент ColdFusion — Crypto.cfc — пытается сделать доступ к таким библиотекам более простым и лаконичным.