Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是Javascript';s JSON.stringfy与PHP';s json_编码?_Javascript_Php_Json_Cryptojs - Fatal编程技术网

是Javascript';s JSON.stringfy与PHP';s json_编码?

是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

我正在尝试使用JavaScript(CryptoJS库)和PHP(内置HMAC函数)对字符串化数据进行HMACSHA256哈希。我担心JavaScript JSON.stringify与PHP JSON_encode()函数不一致/不相同。有没有更好的方法来实现数据(对象/数组)的字符串化

这是我的测试,有效。但是,我担心代码可能遇到的西班牙语字符和其他编码/实体

<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编码器一样,如果给定
    字符串
    整数
    浮点
    布尔
    作为输入值,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和数字)。