我在PHP中有以下代码:
<?php
$decodedSecret = base64_decode("OWOMg2gnaSx1nukAM6SN2vxedfY1yLPONvcTKbhDv7I");
echo base64_encode(hash_hmac("sha512", "1|2481632|1425387916|GET|/api/transaction/read?spaceId=12&id=1", $decodedSecret, true));
?>
并试图在Coldfusion中翻译成这样:
local.secret = toBase64( 'OWOMg2gnaSx1nukAM6SN2vxedfY1yLPONvcTKbhDv7I' );
local.hmacHex = hmac( '1|2481632|1425387916|GET|/api/transaction/read?spaceId=12&id=1', local.secret, 'HMACSHA512' );
local.base64 = binaryEncode( binaryDecode( local.hmacHex, "hex"), "base64" );
然而,由于某种原因,这不起作用,我怀疑问题出在这部分:
local.secret = toBase64( 'OWOMg2gnaSx1nukAM6SN2vxedfY1yLPONvcTKbhDv7I' );
似乎不等同于以下PHP代码:
$decodedSecret = base64_decode("OWOMg2gnaSx1nukAM6SN2vxedfY1yLPONvcTKbhDv7I");
你知道我在这里可能遗漏了什么吗?
更新:
根据Alex的建议,我使用了下面的代码片段来实现在Coldfusion中复制PHP结果的目标。
local.secret = toBinary( 'OWOMg2gnaSx1nukAM6SN2vxedfY1yLPONvcTKbhDv7I=' );
local.hmacHex = hmac( '1|2481632|1425387916|GET|/api/transaction/read?spaceId=12&id=1', local.secret, 'HMACSHA512', 'utf-8' );
local.strBase64 = toBase64( binaryDecode( local.hmacHex, "hex" ) );
不幸的是,toString(toBinary('OWOMg2gnaSx1nukAM6SN2vxedfY1yLPONvcTKbhDv7I'))
没有工作的秘密(这就是为什么我只使用toBinary()
),因为hmac将返回一个不同的结果比预期的一个。这可能意味着hmac处理二进制文件和字符串的方式不同,对于那些感兴趣的人来说。
我只是在处理这些东西。如果你想从64进制编码的字符串数据中创建二进制,你需要toBinary()。
<cfset bData = toBinary(form.base64Data) />
<cfcontent variable=bData type="application/pdf" />
我刚刚构建了一个简单的表单来粘贴Base64数据并获取二进制文件。(我知道它是PDF内容,因此MIME类型。)