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가 감가 상각되고있다. 어떤 통찰력이라도 대단히 감사합니다. 감사! 의견에 따라
감사합니다. Leigh. 확실히 무엇이 옳고 그른지를 말할 수는 없지만 CF의 hmac() 함수와 함께 binaryEncode/binaryDecode를 사용하여 결과 자체가 꺼져 있다고 말할 수 있습니다. ColdFusion에서 뭔가 잘못되었다고 생각합니다. 또는 Hex에서 Binary로 변환하는 방식으로 생각합니다. 당사의 지불 프로세서는 수천 개의 회사와 통합되며 toBase64() 결과와 일치합니다. 또한, 우리는 hash_hmac와 base64_encode를 사용하여 PHP로 설정했고, CF의 toBase64() 결과와 일치시킵니다. 이 두 가지 문제는 binaryEncode/Decode w/cf의 hmac()에서 문제가있는 것처럼 보입니다. – billvsd
HMACSHA1을 사용하여 일치하는 hmac() 서명 값을 얻을 수 있었지만 HMACSHA256을 사용하면 지불 제공자 나 PHP가 예상 한 것과 일치하지 않습니다. – billvsd
지불 프로세서의 개별 규칙과 필요한 것은 완전히 다른 이야기입니다. 그러나 그것은 16 진수에서 16 진수로 변환하는 정확한 방법이 아닙니다. 즉, API가 요구하는 것 인 경우 위에서 설명한 내용 만 수행하면됩니다. 16 진수를 UTF8로 디코드하고 base64로 다시 인코딩하십시오.'binaryEncode (charsetDecode (hmacHex, "utf-8"), "base64")' – Leigh