PHP base64_decode等效ColdFusion代码运行异常问题排查
PHP转写ColdFusion时HMAC签名结果不一致问题
参考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)); ?>
初始错误转写版本
以下转写代码运行结果和PHP输出不匹配:
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");
PHP的base64_decode()作用是将Base64格式字符串解码为原始二进制字节串,而初始ColdFusion代码误用toBase64(),对本身已是Base64格式的密钥重复做Base64编码,导致传入HMAC函数的密钥值完全错误。
正确可用代码
调整密钥解码逻辑、显式指定编码后,可完全复现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" ) );
注意事项
- 不可对
toBinary()返回的二进制密钥调用toString()转成字符串后再传入HMAC函数,该操作会导致签名结果错误 - ColdFusion的
hmac()函数对二进制类型入参和字符串类型入参的处理逻辑存在差异,计算签名时需直接传入解码得到的二进制密钥,不要做额外字符串转换 - Base64解码时注意补全末尾缺失的
=填充符,避免解码结果异常
内容的提问来源于stack exchange,提问作者asre asse
相关产品推荐
相关产品推荐

