我嘗試使用ColdFusion的hmac()函數來計算使用binaryEncode(binaryObj,'Base64')而不是toBase64的HMAC值,因爲toBase64正在折舊。它適用於toBase64(),但不適用於binaryEncode()。文檔不是很豐富。有人可以幫助我理解爲什麼我不能使用binaryEncode獲得相同的值嗎?ColdFusion hmac()返回不同的值toBase64和binaryEncode
據我所知,hmac()函數以十六進制格式返回結果。 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>
的結果是:
hmacBase64: VEVGNnqg9b0eURaDCsA4yIOz5c+QtoJqIPInEZOuRm4=
toBase64: NTQ0NTQ2MzY3QUEwRjVCRDFFNTExNjgzMEFDMDM4Qzg4M0IzRTVDRjkwQjY4MjZBMjBGMjI3MTE5M0FFNDY2RQ==
有一件事我注意到的是結果是更長的使用toBase64時。我似乎無法弄清楚爲什麼我不能使用binaryEncode。我想自從toBase64被折舊。任何見解都非常感謝。謝謝!
感謝您的迴應Leigh。雖然我不能確定是對還是錯,但我可以說結果本身似乎使用了binaryEncode/binaryDecode和CF的hmac()函數。我認爲ColdFusion中有些東西不正確,或者我將它從Hex轉換爲Binary轉換爲Base64。我們的支付處理器可與數千家公司進行集成,並與toBase64()結果相匹配。另外,我們使用hash_hmac和base64_encode在PHP中設置它,並且它匹配CF的toBase64()結果。這兩件事看起來像是用binaryEncode/Decode w/cf的hmac()解決問題。 – billvsd
我應該注意到,我能夠使用HMACSHA1獲得匹配的hmac()簽名值,但是,使用HMACSHA256與我們的支付提供程序和PHP不符。 – billvsd
那麼支付處理器的個別規則和他們所要求的是完全不同的故事;-)但是,這不是*將十六進制轉換爲base64的正確方法。也就是說,如果這就是他們的API所要求的,那就按照我上面所解釋的那樣做。將十六進制解碼爲UTF8,並將其重新編碼爲base64:'binaryEncode(charsetDecode(hmacHex,「utf-8」),「base64」)' – Leigh