首页 > 编程语言 >关于JSON转字符串后前端与python得到的结果不一致的问题,及对象按key排序

关于JSON转字符串后前端与python得到的结果不一致的问题,及对象按key排序

时间:2024-04-30 14:22:04浏览次数:26  
标签:stringify python json 空格 JSON key dataTmp

背景:

  哈希码参数校验防参数篡改。前端下发接口时对参数按约定秘钥和逻辑进行加密,后端在获取到请求后对请求参数以同样的秘钥和逻辑加密计算得出哈希值,再与请求的哈希值对比,如果不一致则证明参数被篡改。

前端代码:

  对json对象进行了按key排序

1     let dataTmp = this.deepClone(data);
2 
3     let dataStr:string
4  
5     dataStr = JSON.stringify(dataTmp, Object.keys(dataTmp).sort())
6     return CryptoJS.HmacSHA256(dataStr, key).toString(CryptoJS.enc.Hex)

python代码:

1 import json
2 return json.dumps(datas)// 排序和加密代码省略

错误结果原因:

  对相同的参数进行计算前后端得出的结果不一致,经查阅相关资料(JSON.stringify和json.dumps源码)得知,不一致原因是空格的不同导致。JSON.stringify默认(0)是没有空格,而json.dumps默认(None)是1个空格,而且二者在设置空格数1时对第一个key之前的空格表现也不同。1时JSON.stringify第一个key前仍有空格('{\n "a": 1\n}'),而json.dumps没有。经测试0.5时JSON.stringify可以去除第一个key前的空格('{\n"a": 1\n}')。因而设置空格数1以上时,前后端可以得到相同结果。

正确结果编码:

  前端:

1  let dataTmp = this.deepClone(data);
2 
3 et dataStr:string
4 
5 dataStr = JSON.stringify(dataTmp, Object.keys(dataTmp).sort(),4)
6 return CryptoJS.HmacSHA256(dataStr, key).toString(CryptoJS.enc.Hex)

  python:

1 import json
2 return json.dumps(datas,indent=4)

 

标签:stringify,python,json,空格,JSON,key,dataTmp
From: https://www.cnblogs.com/ljwsyt/p/18167953

相关文章

  • Go语言常用标准库——json、文件操作、template、依赖管理及Go_module使用
    文章目录Go语言之jsonMarshal函数Unmarshal函数Go语言之文件操作打开和关闭文件读取文件file.Read()基本使用循环读取bufio读取文件ioutil读取整个文件文件写入操作Write和WriteStringbufio.NewWriterioutil.WriteFile练习copyFile实现一个cat命令template模板模板示例依......
  • Python-与-TensorFlow2-生成式-AI(五)
    Python与TensorFlow2生成式AI(五)原文:zh.annas-archive.org/md5/d06d282ea0d9c23c57f0ce31225acf76译者:飞龙协议:CCBY-NC-SA4.0第十二章:用生成式人工智能玩视频游戏:GAIL在之前的章节中,我们已经看到如何使用生成式人工智能来生成简单的(受限玻尔兹曼机器)和复杂的(变分自动......
  • python grpc简单使用
    pythongrpc简单使用1、rpc和grpc关系RPC(RemoteProcedureCallProtocol),直译来看就是远程过程调用协议。它提供了一套机制,使得应用程序之间可以进行通信,使用时客户端调用server端的接口就像调用本地的函数一样方便。并且server端和client端不限语言,任何语言遵循protobuf协议......
  • python 对文件夹重命名
    importosdefrename_folders(root_dir,level=1,parent_prefix=''):#计数器,用于生成唯一的名称counter=1#遍历文件夹fordirpath,dirnames,filenamesinos.walk(root_dir):#只处理文件夹(不处理文件)......
  • python脚本获取当前浏览器客户端的公共ip以及其详细信息
    python脚本获取当前客户端的公共ip以及其详细信息importrequestsfromflaskimportFlask,request,make_response,send_from_directoryfromdatetimeimportdatetimeimportasynciofromhypercorn.asyncioimportservefromhypercorn.configimportConfigimportos......
  • Python重试任务模块tenacity
    1.简介在实际应用中,经常会碰到在web请求时,因为网络的不稳定,会有请求超时的问题,这时候,一般都是自己去实现重试请求的逻辑,直到得到响应或者超时。虽然这样的逻辑并不复杂,但是代码写起来却不那么优雅,不那么pythonic。tenacity是一个重试库,使用python语言编写,它能够让我们在任务的重......
  • Python-重试任务模块tenacity
     1.软硬件环境windows1164bits python3.6tenacity2.简介在实际应用中,经常会碰到在web请求时,因为网络的不稳定,会有请求超时的问题,这时候,一般都是自己去实现重试请求的逻辑,直到得到响应或者超时。虽然这样的逻辑并不复杂,但是代码写起来却不那么优雅,不那么pythonic。tenaci......
  • 社会网络分析及其Python实现
    社会网络分析(SocialNetworkAnalysis,SNA)在人类学、心理学、社会学、数学以及统计学等领域中发展起来,是综合运用图论、数学模型来研究社会行动者之间的关系或通过这些关系流动的各种有形或无形的东西,如信息、资源等,近年来逐渐成为一种热门的社会科学研究方法。社会网络分析旨在......
  • python3解析FreeSWITCH会议室列表信息
    操作系统:CentOS7.6_x64FreeSWITCH版本:1.10.9 Python版本:3.9.12进行FreeSWITCH会议室相关功能开发过程中,会遇到需要解析会议室列表信息并进行特定操作的情况,比如设置特定通道变量、发送dtmf、录音等。今天整理下CentOS7环境下,使用Python3解析FreeSWITCH会议室列表信息然后......
  • HydroOJ 从入门到入土(17)批量转化其他格式题库(Python)
    新题库,新快乐,新痛苦。一、想法有了多种题库之后,常常会遇到大量题库无法转化到自己的OJ上。每次都要重新手写解析器,非常浪费时间,于是抽出了这个工具。本工具可以将抽取好的信息自动组装成符合HydroOJ格式的题目并自动压缩,解决后半部分的转化工作。二、实现1.准备包和相......