Преобразование C # в ColdFusion

У меня нет опыта работы с C #, и мне было интересно, может ли кто-нибудь помочь преобразовать этот фрагмент C # в ColdFusion.

string inputString = "abccde";
string securityKey = "abcdefghijk...";

// Convert security key into ASCII bytes using utf8 encoding
byte[] securityKeyBytes = UTF8Encoding.ASCII.GetBytes(securityKey);

// Create an HMACSHA1 hashing object that has been seeded with the security key bytes
HMACSHA1 hasher = new HMACSHA1(securityKeyBytes);

// Convert input string into ASCII bytes using utf8 encoding
byte[] inputBytes = UTF8Encoding.ASCII.GetBytes(inputString.ToCharArray());

// Compute the has value
byte[] hash = hasher.ComputeHash(inputBytes);

// Convert back to a base 64 string
string securityToken = Convert.ToBase64String(hash);

return securityToken;

Я нашел это в stackOverFlow и вот то, что у меня есть на данный момент. Я иду в правильном направлении? Любые идеи будут очень признательны!

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

<cfset signMsg= "abccde">
<cfset signatureString = "abcdefghijk...">
<cfset result = CFHMAC(signMsg=signMsg, signKey=signatureString) />
<cfdump var="#result#" />

person user752746    schedule 13.12.2015    source источник
comment
Спасибо за ответ, Ли, я попробую твое предложение, когда вернусь домой.   -  person user752746    schedule 13.12.2015


Ответы (1)


(Расширено из комментариев)

CF11 имеет функцию HMAC уже встроен, так что, возможно, вам не понадобится этот UDF. Я бы посоветовал попробовать. Обратите внимание, что в коде C # используется UTF8Encoding.ASCII:

Символы ASCII ограничены 128 младшими символами Unicode, от U + 0000 до U + 007F ....

Обратите внимание, что кодировка ASCII имеет 8-битную неоднозначность, которая может допускать злонамеренное использование, но кодировка UTF-8 устраняет двусмысленность в отношении 8-го бита. ... Он использует резервную замену для замены каждой строки, которую он не может кодировать, и каждого байта, который он не может декодировать, с помощью знака вопроса ("?").

Предполагая, что вам необходимо поддерживать совместимость с каким-либо другим приложением и сохранять ту же кодировку, UTF8Encoding.ASCII должен соответствовать кодировке «US-ASCII» в CF / Java, но проведите некоторое тестирование, чтобы проверить обработку недопустимых символов. Если у вас есть возможность изменить кодировку, я бы рекомендовал вместо этого использовать UTF-8. Имейте в виду, что функция CF всегда возвращает шестнадцатеричное число. Если вместо этого вам нужна строка base64, вам придется преобразовать ее с помощью binaryEncode () и binaryDecode ().

Пример:

<!--- Only required when hard coding UTF8 characters into a script --->
<cfprocessingdirective pageEncoding="utf-8">
<cfset message = "Pi π and Sigma Σ.">
<cfset key = "abcdefghijk">
<cfset hexHash = hmac(message, key, "HMACSHA1", "US-ASCII")>
<cfset base64Hash = binaryEncode(binaryDecode(hexHash, "hex"), "base64")>
<cfdump var="#base64Hash#">

Результат:

HMACSHA1 = J2AZf+zhrebIA/tK3i5PYb4b/Fo= 

Боковое примечание о CFHMAC UDF: будьте очень осторожны с кодированием при извлечении байтов строки. Как я отмечал в комментариях, лучше избегать использования getBytes(), потому что он предполагает кодировку по умолчанию, какой бы она ни была. Это означает, что он не всегда может возвращать желаемые результаты и может варьироваться от одного jvm к другому. Вместо этого лучше всегда указывать кодировку явно, например getBytes("UTF-8"), getBytes("US-ASCII") и так далее.

person Leigh    schedule 13.12.2015
comment
Поскольку не все читают комментарии, я решил просто исправить этот UDF, чтобы избежать проблем с кодированием в будущем ;-) - person Leigh; 14.12.2015
comment
Привет, Ли, я очень ценю расширенное объяснение и пример! Это дает мне отличную отправную точку. - person user752746; 14.12.2015