HMAC SHA1 ColdFusion - PullRequest
       42

HMAC SHA1 ColdFusion

5 голосов
/ 02 июня 2010

Пожалуйста, помогите! Я выдернул себе волосы над этим. :)

У меня есть сайт, который мне нужен для HMAC SHA1 для аутентификации. В настоящее время он работает с другим языком, но теперь мне нужно переместить его в ColdFusion. Для жизни я не могу заставить струны соответствовать. Любая помощь будет высоко ценится.

Данные: https%3A%2F%2Fwww%2Etestwebsite%2Ecom%3Fid%3D5447
Ключ: 265D5C01D1B4C8FA28DC55C113B4D21005BB2B348859F674977B24E0F37C81B05FAE85FB75EA9CF53ABB9A174C59D98C7A61E2985026D2AA70AE4452A6E3F2F9

Правильный ответ: WJd%2BKxmFxGWdbw4xQJZXd3%2FHkFQ%3d
Мой ответ: knIVr6wIt6%2Fl7mBJPTTbwQoTIb8%3d

Обе кодируются в Base64, а затем в URL.

Ответы [ 3 ]

9 голосов
/ 02 июня 2010

Сам делаю HMAC-SHA1. Лучшее, что я могу сказать, это то, что я нашел эту старую функцию. Работал отлично для того, что я делаю до сих пор. Забыл, где я нашел это, таким образом я не могу поверить автору.

Для вашего Base 64 ... запустите эту функцию в вашем шифровании, затем просто выполните cfset newString = toBase64 (oldString) для того, что возвращается.

<cffunction name="hmacEncrypt" returntype="binary" access="public" output="false">
   <cfargument name="signKey" type="string" required="true" />
   <cfargument name="signMessage" type="string" required="true" />
   <cfargument name="algorithm" type="string" default="HmacSHA1" />
   <cfargument name="charset" type="string" default="UTF-8" />

   <cfset var msgBytes = charsetDecode(arguments.signMessage, arguments.charset) />
   <cfset var keyBytes = charsetDecode(arguments.signKey, arguments.charset) />
   <cfset var keySpec = createObject("java","javax.crypto.spec.SecretKeySpec")  />
   <cfset var mac = createObject("java","javax.crypto.Mac") />

   <cfset key = keySpec.init(keyBytes, arguments.algorithm) />
   <cfset mac = mac.getInstance(arguments.algorithm) />
   <cfset mac.init(key) />
   <cfset mac.update(msgBytes) />

   <cfreturn mac.doFinal() />
</cffunction>
4 голосов
/ 21 августа 2012

Более короткий метод шифрования (основан на метод Барни ), который выводит строку:

<cffunction name="CFHMAC" output="false" returntype="string">
   <cfargument name="signMsg" type="string" required="true" />
   <cfargument name="signKey" type="string" required="true" />
   <cfargument name="encoding" type="string" default="utf-8" />
   <cfset var key = createObject("java", "javax.crypto.spec.SecretKeySpec").init(signKey.getBytes(arguments.encoding), "HmacSHA1") />
   <cfset var mac = createObject("java", "javax.crypto.Mac").getInstance("HmacSHA1") />
   <cfset mac.init(key) />
   <cfreturn toBase64(mac.doFinal(signMsg.getBytes(arguments.encoding))) />
</cffunction>

Дополнительно

  1. ColdFusion 10 поддерживает HMAC-SHA1 для шифрования и хеширования.
  2. Существует библиотека под названием CF_HMAC, распространяемая Adobe
  3. Есть несколько библиотек, которые имеют отношение к HMAC в отношении подписи файлов для Amazon. Среди них cf-amazon-s3 , Barney S3 URL Builder и RIAForge S3
1 голос
/ 04 июня 2010

Стив - Спасибо за ваш ответ. Я на самом деле уже использовал функцию hmacEncrypt. Я понял свою проблему, хотя. Я передавал шестнадцатеричный ключ вместо строки. Он принял ключ, потому что технически это была строка. Чтобы вернуть его обратно в строку, я использовал другую функцию вместе с вышеупомянутой. Следующий ниже изменяет HEX в строку. Я не писал функции ниже и не помню, откуда она взялась, чтобы получить кредит автора, но она работала отлично

<cffunction name="Hex2Bin" returntype="any" hint="Converts a Hex string to binary">
    <cfargument name="inputString" type="string" required="true" hint="The hexadecimal string to be written.">
    <cfset var outStream = CreateObject("java", "java.io.ByteArrayOutputStream").init()>
    <cfset var inputLength = Len(arguments.inputString)>
    <cfset var outputString = "">
    <cfset var i = 0>
    <cfset var ch = "">
    <cfif inputLength mod 2 neq 0>
    <cfset arguments.inputString = "0" & inputString>
    </cfif>
    <cfloop from="1" to="#inputLength#" index="i" step="2">
        <cfset ch = Mid(inputString, i, 2)>
        <cfset outStream.write(javacast("int", InputBaseN(ch, 16)))>
    </cfloop>
    <cfset outStream.flush()>
    <cfset outStream.close()> 
    <cfreturn outStream.toByteArray()>
</cffunction> 
...