gpt4 book ai didi

ColdFusion hmac() 使用 toBase64 和 binaryEncode 返回不同的值

转载 作者:行者123 更新时间:2023-12-04 01:55:52 25 4
gpt4 key购买 nike

我正在尝试使用 ColdFusion 的 hmac() 函数通过 binaryEncode(binaryObj,'Base64') 而不是 toBase64() 来计算 HMAC 值,因为该函数已被弃用。它与 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>

结果是:

hmacBase64: VEVGNnqg9b0eURaDCsA4yIOz5c+QtoJqIPInEZOuRm4=
toBase64: NTQ0NTQ2MzY3QUEwRjVCRDFFNTExNjgzMEFDMDM4Qzg4M0IzRTVDRjkwQjY4MjZBMjBGMjI3MTE5M0FFNDY2RQ==

我注意到的一件事是使用 toBase64() 时结果要长得多。我似乎不明白为什么我不能使用 binaryEncode()。但是,我想这样做,因为 toBase64() 已被弃用。非常感谢任何见解。谢谢!

最佳答案

根据评论更新:

很好用ToBase64(Hmac(...)) 不是将十六进制字符串转换为 base64 的正确方法 ;-) 但是,听起来 API 需要的不是直接转换。如果是这样,就做 ToBase64(hmac(...))代码正在做。 ie 将十六进制字符串解码为 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 个字符。所以 binary 值应该是 32 字节。要获得正确的二进制值,必须将字符串解码为十六进制:

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

ToBase64 的问题在于它对字符串的解码不正确。它将输入视为 UTF8 并单独解码字符串中的字符。所以二进制值是它应该的大小的两倍。注意到它是 64 字节,而不是 32 字节吗?这就是为什么最后的字符串也更长。

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

因此,这两种方法再次产生不同的结果,因为它们对完全不同的值进行编码。但是,严格来说,只有第一种方法是正确的。要将十六进制字符串重新编码为 base64,请使用 binaryEncode/binaryDecode :

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

关于ColdFusion hmac() 使用 toBase64 和 binaryEncode 返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39841363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com