bil*_*vsd 2 binary coldfusion hex sha256 hmac
我正在尝试使用 ColdFusion 的hmac()函数来计算 HMAC 值,binaryEncode(binaryObj,'Base64')而不是使用toBase64(),因为该函数已被弃用。它toBase64()与binaryEncode(). 这些文档的信息量不是很大。有人可以帮助我理解为什么我不能使用 获得相同的价值binaryEncode吗?
据我了解,该hmac()函数以十六进制格式返回结果。binaryEncode()期望一个二进制值,因此hmac()必须先将结果从十六进制转换为二进制,然后才能将其转换为 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>
Run Code Online (Sandbox Code Playgroud)
结果是:
hmacBase64: VEVGNnqg9b0eURaDCsA4yIOz5c+QtoJqIPInEZOuRm4=
toBase64: NTQ0NTQ2MzY3QUEwRjVCRDFFNTExNjgzMEFDMDM4Qzg4M0IzRTVDRjkwQjY4MjZBMjBGMjI3MTE5M0FFNDY2RQ==
Run Code Online (Sandbox Code Playgroud)
我注意到的一件事是使用toBase64(). 我似乎无法弄清楚为什么我不能使用binaryEncode(). 但是,我想,因为toBase64()正在被弃用。任何见解都非常感谢。谢谢!
根据评论更新:
用好ToBase64(Hmac(...))是不是为十六进制字符串转换为Base64正确的方式;-)但是,它听起来就像是API需要比直接转换其他的东西。如果是这样,只需执行ToBase64(hmac(...))代码正在执行的操作。即将十六进制字符串解码为 UTF8 并将其重新编码为 base64:
matchingResult = binaryEncode(charsetDecode(hmacHex, "utf-8"), "base64")
简短的回答:
这两种方法编码完全不同的值。这就是结果不匹配的原因。将十六进制字符串转换为 base64 的正确方法是使用BinaryEncode/Decode()。
更长的答案:
<!--- correct hmac signature --->
toBase64: #toBase64(hmac(string,secretKey,'HMACSHA256'))#<br>
实际上,这不是将十六进制转换为 base64 的正确方法。
十六进制和 Base64 只是表示二进制值的不同方式。为了得到相同的结果,这两种方法需要从相同的二进制文件开始。在这种情况下,实际上是编码完全不同的值。因此结果的差异。
对于十六进制字符串,每个字节由两个字符表示。所以二进制文件将是原始字符串大小的一半。在 HMAC(HMACSHA256) 的情况下,生成的十六进制字符串长度为 64 个字符。所以二进制值应该是 32 个字节。要获得正确的二进制值,必须将字符串解码为 hex:
original string length = #len(hmacHex)#
binary size = #arrayLen(binaryDecode(hmacHex, "hex"))#
Run Code Online (Sandbox Code Playgroud)
ToBase64 的问题在于它错误地解码字符串。它将输入视为 UTF8 并单独解码字符串中的字符。所以二进制值是它应该大小的两倍。注意它是 64 个字节,而不是 32 个?这就是为什么最后的字符串也更长的原因。
UTF8 binary size = #arrayLen(charsetDecode(hmacHex, "utf-8"))#
ToBase64 binary size = #arrayLen(binaryDecode(toBase64(hmacHex), "base64"))#
Run Code Online (Sandbox Code Playgroud)
同样,这两种方法产生不同的结果,因为它们编码完全不同的值。但是,严格来说,只有第一种方法是正确的。要将十六进制字符串重新编码为 base64,请使用binaryEncode/binaryDecode:
correctResult = binaryEncode(binaryDecode(hmacHex, "hex"), "base64")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
700 次 |
| 最近记录: |