Json::FastWriter writer的顺序对MD5加密的影响

Json::FastWriter writer的顺序

Json::FastWriter是 jsoncpp 的一种操作类型,jsoncpp主要包含三种类型的类:
1)Value类:Value是JsonCpp库最为重要的类,它代表JSON格式字符串在内存中的状态,修改JSON格式字符串需先修改其Value对象,然后序列化输出。
2)Reader类:Reader用来将一个JSON文件或JSON格式的字符串解析成Value对象,其parse()接口第一个参数为JSON格式字符串,第二个参数是解析后Value对象,如果JSON格式正确将解析成功。
3)Writer类:Writer(将Value数据转换写成json格式)Jsoncpp 的 Json::Writer 类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter(快速字符串型)、Json::StyledWriter(标准Json类型)、Json::StyledStreamWriter。这里使用Fast Writer;

jsoncpp 中所有对象、类名都在 namespace Json 中,需要包含 json.h 头文件。

在使用Json::FastWriter writer会改变josn写入时的顺序,这是因为使用jsoncpp创建文件的时候,它是按照字母表给排序过的,在排序的过程中,需要注意大小字母是不做区分的,还得根据后面字母比对作后面的排序。
在使用Json::Value root;写入键值时的顺序,通过writer再写回到字符串时,顺序会发生变化:Json::FastWriter writer; //Json::StyledWriter writer; std::string strWrite = writer.write(root);
这种顺序的变化,不会影响url的数据请求,但是,当你的json数据作为json数据字符加入MD5计算时,需要注意,将你拼接加密字符串内json的数据务必也安装字母表的顺序进行加密排序,这样sign数字签名才能成功。
以下为某平台对HTTP,POST请求JSON数据MD5加密的算法:
请求入参加密说明
第一步,设所有发送的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空则不参与签名;
◆ 参数名区分大小写;
◆ 若参数为对象或数组,则value为对应JSON字符串
◆ 传送的sign参数不参与签名
第二步,在stringA最后拼接上appSecret得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

下图,为通过JSON::Value写入的顺序

在这里插入图片描述

下图为经过FastWriter之后的Json顺序

**:
在这里插入图片描述

2021.12.17 用于记录Josn顺序在进行MD5加密算法时,导致数字签名不成功的记录,这个问题在调试时对我产生了不小的困扰,以此为记。

附录1:MD5在线计算工具网站:

https://md5jiami.bmcx.com/?_t=1552612737这个计算工具非常好,可以用来验证自己设计的MD5算法是否正确,一般网络上有些MD5计算程序,当字符长度超过56个时计算不会正确,所以用这个在线工具可以验证MD5计算是否正确。下图为MD5在线计算工具图:
在这里插入图片描述

附录2:JSON Value类的操作:

Json::Value json_temp; // 临时对象,供如下代码使用
  json_temp[“name”] = Json::Value(“huchao”);
  json_temp[“age”] = Json::Value(26);
  Json::Value root; // 表示整个 json 对象
  root[“key_string”] = Json::Value(“value_string”); // 新建一个 Key(名为:key_string),赋予字符串值:“value_string”。
  root[“key_number”] = Json::Value(12345); // 新建一个 Key(名为:key_number),赋予数值:12345。
  root[“key_boolean”] = Json::Value(false); // 新建一个 Key(名为:key_boolean),赋予bool值:false。
  root[“key_double”] = Json::Value(12.345); // 新建一个 Key(名为:key_double),赋予 double 值:12.345。
  root[“key_object”] = Json_temp; // 新建一个 Key(名为:key_object),赋予 json::Value 对象值。
  root[“key_array”].append(“array_string”); // 新建一个 Key(名为:key_array),类型为数组,对第一个元素赋值为字符串:“array_string”。
  root[“key_array”].append(1234); // 为数组 key_array 赋值,对第二个元素赋值为:1234。
  Json::ValueType type = root.type(); // 获得 root 的类型,此处为 objectValue 类型。

参考文献:

https://blog.csdn.net/linkedin_35878439/article/details/81091905
https://www.cnblogs.com/yelongsan/p/4134384.html
https://www.cnblogs.com/fire909090/p/14918779.html
http://www.cppblog.com/wanghaiguang/archive/2013/12/26/205020.html
https://vimsky.com/examples/detail/cpp-ex-json-FastWriter-write-method.html
https://stackoverflow.com/questions/6352861/json-invalid-utf-8-middle-byte

2021.12.17 cjmsea

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cjmsea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值