是Javascript';s JSON.stringfy与PHP';s json_编码?
我正在尝试使用JavaScript(CryptoJS库)和PHP(内置HMAC函数)对字符串化数据进行HMACSHA256哈希。我担心JavaScript JSON.stringify与PHP JSON_encode()函数不一致/不相同。有没有更好的方法来实现数据(对象/数组)的字符串化 这是我的测试,有效。但是,我担心代码可能遇到的西班牙语字符和其他编码/实体是Javascript';s JSON.stringfy与PHP';s json_编码?,javascript,php,json,cryptojs,Javascript,Php,Json,Cryptojs,我正在尝试使用JavaScript(CryptoJS库)和PHP(内置HMAC函数)对字符串化数据进行HMACSHA256哈希。我担心JavaScript JSON.stringify与PHP JSON_encode()函数不一致/不相同。有没有更好的方法来实现数据(对象/数组)的字符串化 这是我的测试,有效。但是,我担心代码可能遇到的西班牙语字符和其他编码/实体 <h1>Testing HMAC Javascript to PHP Comparison</h1> &l
<h1>Testing HMAC Javascript to PHP Comparison</h1>
<br><br>
<div id="php_mac">
<?php
// Testing HMAC
$security_key = '0123456789';
$obj = array(
'field1' => 1,
'field2' => '2',
'field3' => "'",
);
// Calculate HMAC SHA256
$str_data = json_encode($obj);
echo "PHP str_data: ".$str_data."<br>";
$hash = hash_hmac('sha256', $str_data, $security_key, true);
$hashInBase64 = base64_encode($hash);
echo "PHP hashInBase64: ".$hashInBase64;
?>
</div>
<br><br>
<div id="javascipt_hmac">
<div id="javascript_str_data"></div>
<div id="javascript_hashInBase64"></div>
<script>
var security_key = '0123456789';
var obj = {
'field1': 1,
'field2': '2',
'field3': "'",
};
// Create security hash based on posted data
var str_data = JSON.stringify(obj);
$('#javascript_str_data').html('str_data: '+str_data);
// Using CryptoJS to HMAC SHA256 the str_data
var hash = CryptoJS.HmacSHA256(str_data, security_key);
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
$('#javascript_hashInBase64').html('JS hashInBase64: '+hashInBase64)
</script>
</div>
测试HMAC Javascript与PHP的比较
var security_key='0123456789';
var obj={
“字段1”:1,
“字段2”:“2”,
'字段3':“'”,
};
//基于发布的数据创建安全哈希
var str_data=JSON.stringify(obj);
$('#javascript_str_data').html('str_data:'+str_data');
//将CryptoJS用于HMAC SHA256 str_数据
var hash=CryptoJS.HmacSHA256(str_数据,安全密钥);
var hashInBase64=CryptoJS.enc.Base64.stringify(散列);
$('#javascript_hashInBase64').html('JS hashInBase64:'+hashInBase64)
其他想法:我担心JSON方法的间距/引用差异。也许我应该循环遍历对象/数组,并仅使用“值”来生成要HMAC’ed的数据字符串?假设可以将其保留为单个数组/对象,则应生成一致的“值”字符串。但是,那么如何保持一致的顺序呢。我假设可以先按键排序。正如注释中提到的@Pointy,
JSON.stringify
和JSON\u encode
的输出可能在两种情况下略有不同:
字符串
、整数
、浮点
或布尔
作为输入值,JSON_encode()将生成简单值(即既不是对象也不是数组)的JSON。虽然大多数解码器会接受这些值作为有效的JSON,但有些可能不会,因为规范在这一点上是不明确的。总之,请始终测试JSON解码器是否能够处理从JSON_encode()生成的输出
如果你担心数据被忠实地重新创建,请考虑在存储数据之前对数据进行编码(即Base64编码)。
p.S.如果要使用HMAC访问数据,则需要1)仅使用HMAC访问值,2)确保每次都以相同的顺序访问值,因为JSON对数组以外的任何内容都没有排序承诺。序列化输出可能是相同的,但可能不是。JSON编码器工作的唯一要求是,解析结果时可以识别为JSON。例如,空格可以变化,编码器对7位ASCII范围之外的字符进行编码的方式也可以变化。即使是在两个不同的JavaScript实现之间,您也可能会看到差异。在XML上下文中,我认为摘要计算通常涉及到如何正确处理标记(和属性)内容的规定。似乎这样的方法更可靠。它是用于HMAC SHA256内容哈希的,用于安全验证。我将坚持在内容字符串创建中使用特定ID(GUID和数字)。