Помогите! Я вытаскивал волосы по этому.:)
У меня есть сайт, в котором я нуждаюсь к HMAC SHA1 для аутентификации. Это в настоящее время работает с другим языком, но теперь я должен переместить его в ColdFusion. Ни за что в жизни я не могу заставить строки соответствовать. Любая помощь очень ценилась бы.
Данные: https%3A%2F%2Fwww%2Etestwebsite%2Ecom%3Fid%3D5447
Ключ: 265D5C01D1B4C8FA28DC55C113B4D21005BB2B348859F674977B24E0F37C81B05FAE85FB75EA9CF53ABB9A174C59D98C7A61E2985026D2AA70AE4452A6E3F2F9
Корректный ответ: WJd%2BKxmFxGWdbw4xQJZXd3%2FHkFQ%3d
Мой ответ: knIVr6wIt6%2Fl7mBJPTTbwQoTIb8%3d
Оба - закодированный Base64 и затем закодированный URL.
Сам делаю 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>
Стив - Спасибо за ответ. На самом деле я уже использовал функцию 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>