2016-10-03 1 views
1

toBase64가 감가 상각되기 때문에 ColdFusion의 hmac() 함수를 사용하여 toBase64 대신 binaryEncode (binaryObj, 'Base64')를 사용하여 HMAC 값을 계산하려고합니다. 그것은 toBase64()에서는 완벽하게 작동하지만 binaryEncode()에서는 작동하지 않습니다. 문서는별로 유익하지 않습니다. 누군가가 왜 binaryEncode를 사용하여 동일한 값을 얻을 수 없는지 이해할 수 있습니까?toBase64 및 binaryEncode와 다른 값을 반환합니다.

내가 이해 한대로 hmac() 함수는 결과를 16 진수 형식으로 반환합니다. BinaryEncode()는 바이너리 값을 필요로하므로 hmac() 결과는 Hex에서 Binary로 먼저 변환 되어야만하므로 Binary에서 Base64로 바뀔 수 있습니다.

<cfset string = "1234567890" /> 
<cfset secretKey = "abcdefghijklmnopqrstuvwxyz" /> 
<!--- Get Hex results from HMAC() ---> 
<cfset hmacHex = hmac(string,secretKey,'HMACSHA256') /> 
<!--- Decode the binary value from hex ---> 
<cfset hmacAsBinary = binaryDecode(hmacHex,'hex') /> 
<!--- Convert binary object to Base64 ---> 
<cfset hmacBase64 = binaryEncode(hmacAsBinary, 'base64') /> 
<cfoutput> 
    <!--- incorrect hmac signature ---> 
    hmacBase64: #hmacBase64#<br> 
    <!--- correct hmac signature ---> 
    toBase64: #toBase64(hmac(string,secretKey,'HMACSHA256'))#<br> 
</cfoutput> 

결과는 다음과 같습니다 toBase64를 사용할 때 통지

hmacBase64: VEVGNnqg9b0eURaDCsA4yIOz5c+QtoJqIPInEZOuRm4= 
toBase64: NTQ0NTQ2MzY3QUEwRjVCRDFFNTExNjgzMEFDMDM4Qzg4M0IzRTVDRjkwQjY4MjZBMjBGMjI3MTE5M0FFNDY2RQ== 

한 가지 결과가 훨씬 이상이다. binaryEncode를 사용할 수없는 이유를 알아낼 수 없습니다. 나는 toBase64가 감가 상각되고있다. 어떤 통찰력이라도 대단히 감사합니다. 감사! 의견에 따라

답변

3

업데이트 :

ToBase64(Hmac(...))를 사용 그러나, 그것은 API 같은 소리 ;-) 64 기수로 16 진수 문자열로 변환하는 올바른 방법 하지이다 직선 변환이 아닌 다른 무언가를 필요로한다. 그렇다면 ToBase64(hmac(...)) 코드가 수행하는 작업 만 수행하십시오. 즉, 디코드 64 기수로 UTF8 및 재 인코딩이 같은 16 진수 문자열 :

matchingResult = binaryEncode(charsetDecode(hmacHex, "utf-8"), "base64")


짧은 답변 :

두 가지 방법이 완전히 다른 값을 인코딩합니다. 그것이 결과가 일치하지 않는 이유입니다. base64로 16 진수 문자열을 변환하는 올바른 방법은 BinaryEncode/Decode()을 사용하고 있습니다.

긴 대답 :

<!--- correct hmac signature --->
toBase64: #toBase64(hmac(string,secretKey,'HMACSHA256'))#<br>

사실 그베이스 64에 진수로 변환하는 올바른 방법 하지입니다.

16 진수와 Base64는 바이너리 값을 나타내는 다른 방법 일뿐입니다. 동일한 결과를 얻으려면 두 메소드가 동일한 바이너리로 시작해야합니다. 이 경우 실제로는 완전히 다른 값을 인코딩합니다. 따라서 결과의 차이.

16 진수 문자열의 경우 각 바이트는 2 자로 표시됩니다. 따라서 바이너리 원래 문자열의 크기가됩니다. HMAC (HMACSHA256)의 경우 결과로 나오는 16 진수 문자열은 64 자입니다. 따라서 바이너리 값은 32 바이트 여야합니다.올바른 이진 값을 구하려면, 문자열 진수로 를 디코딩해야합니다

original string length = #len(hmacHex)# 
binary size = #arrayLen(binaryDecode(hmacHex, "hex"))# 

ToBase64의 문제는 잘못 문자열을 디코딩 것입니다. 입력을 UTF8로 처리하고 문자열 의 문자를 각각으로 디코딩합니다. 따라서 바이너리 값은 두 배가되어야합니다. 32 바이트가 아니라 64 바이트인지 확인하십시오. 이것이 최종 문자열이 길어진 이유입니다.

UTF8 binary size = #arrayLen(charsetDecode(hmacHex, "utf-8"))# 
ToBase64 binary size = #arrayLen(binaryDecode(toBase64(hmacHex), "base64"))# 

다시 두 가지 방법은 완전히 다른 값을 인코딩하므로 서로 다른 결과를 나타냅니다. 그러나 엄밀히 말하면 첫 번째 방법 만 정확합니다. base64로 16 진수 문자열을 다시 인코딩하려면 binaryEncode/binaryDecode :

correctResult = binaryEncode(binaryDecode(hmacHex, "hex"), "base64") 
+0

감사합니다. Leigh. 확실히 무엇이 옳고 그른지를 말할 수는 없지만 CF의 hmac() 함수와 함께 binaryEncode/binaryDecode를 사용하여 결과 자체가 꺼져 있다고 말할 수 있습니다. ColdFusion에서 뭔가 잘못되었다고 생각합니다. 또는 Hex에서 Binary로 변환하는 방식으로 생각합니다. 당사의 지불 프로세서는 수천 개의 회사와 통합되며 toBase64() 결과와 일치합니다. 또한, 우리는 hash_hmac와 base64_encode를 사용하여 PHP로 설정했고, CF의 toBase64() 결과와 일치시킵니다. 이 두 가지 문제는 binaryEncode/Decode w/cf의 hmac()에서 문제가있는 것처럼 보입니다. – billvsd

+0

HMACSHA1을 사용하여 일치하는 hmac() 서명 값을 얻을 수 있었지만 HMACSHA256을 사용하면 지불 제공자 나 PHP가 예상 한 것과 일치하지 않습니다. – billvsd

+1

지불 프로세서의 개별 규칙과 필요한 것은 완전히 다른 이야기입니다. 그러나 그것은 16 진수에서 16 진수로 변환하는 정확한 방법이 아닙니다. 즉, API가 요구하는 것 인 경우 위에서 설명한 내용 만 수행하면됩니다. 16 진수를 UTF8로 디코드하고 base64로 다시 인코딩하십시오.'binaryEncode (charsetDecode (hmacHex, "utf-8"), "base64")' – Leigh

관련 문제