我在CF 8上托管了一个简单的Web表单,该表单发布到服务器外支付处理网站。支付处理器要求加密许多值并将其放在隐藏字段中以验证我作为用户。在他们的文档中,他们展示了如何在PHP,ASP和JSP中完成此操作。
他们的PHP示例
function createHash($chargetotal) {
global $storename, $sharedSecret;
$str = $storename . getDateTime() . $chargetotal . $sharedSecret;
for ($i = 0; $i < strlen($str); $i++) {
$hex_str.=dechex(ord($str[$i]));
}
return hash('sha256', $hex_str);
}
<input type='hidden' value='<? $hash=createHash(80.00); echo "$hash"; ?>'>
我的ColdFusion
txndatetime = DateFormat(now(),'yyyy:mm:dd') & '-' & DateFormat(now(),'HH:mm:ss');
function createHash( chargetotal, txndatetime ) {
var str = application.storename & txndatetime & chargetotal & application.sharedsecret;
var hex_str = binaryEncode( charsetDecode( str, "utf-8" ), "hex" ) ;
return hash( hex_str, "SHA-256" );
}
<input type='hidden' value='#createHash(80.00,txndatetime)#'>
有人能发现任何明显的差异吗?我的哈希与支付网站的预期完全不同。如果CF的哈希函数产生与PHP哈希函数不同的结果,我会感到惊讶(有点)......也许我得到了&#34;转换为十六进制&#34;步错了?也许我的日期格式与PHP中的getDateTime格式不同?
如果我有一台PHP服务器进行测试,我会很高兴,但我现在还没有。
答案 0 :(得分:1)
如果我在PHP中这样做:
echo hash("sha256", "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor");
我得到了
1c3f958abd85c54905c97fe8e0628fe76495711962a27daae34033781486da00
这在CF中:
hash("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", "SHA-256" )
我得到了
1C3F958ABD85C54905C97FE8E0628FE76495711962A27DAAE34033781486DA00
发现差异?您的支付提供商是否进行了区分大小写的检查?如果没有,那么你最后如何构建你的字符串就一定会出现问题。
PHP示例接受一个字符串,在其上循环,获取每个字符的ASCII十进制值,将其转换为十六进制。
您的CF版本采用字符串,将整个事物转换为二进制,然后转换为十六进制。为什么不使用相同的方法?当我在CF中执行此操作时,我获得了最终被散列的字符串的相同值:
for (var i = 1; i <= len(str); i++) {
hex_str &= formatBaseN(asc(mid(str, i, 1)), 16);
}