2015-12-13 4 views
1

У меня нет опыта работы с C#, и мне было интересно, может ли кто-то помочь преобразовать этот фрагмент C# в ColdFusion.Преобразование 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; 

Я нашел this на 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#" /> 
+0

Спасибо за ваш ответ Ли, я попробую ваше предложение, когда вернусь домой. – user752746

ответ

1

(Expanded из комментариев)

CF11 имеет HMAC function уже встроенные, так что возможно вам не нужно, что 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() and 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") и т. Д.

+0

Поскольку не все читают комментарии, я решил исправить этот UDF, чтобы избежать будущих проблем с кодированием ;-) – Leigh

+0

Привет, Ли, я очень ценю расширенное объяснение и пример! Это дает мне отличную отправную точку. – user752746

+0

Рад, что это помогло :) – Leigh

Смежные вопросы