Android根据类排序生成签名字符串关于change和serialVersionUID的问题

前言

前阵子写过一个关于类生成签名字符串的文章《

【干货】Android根据类生成签名字符串

》,当时各种测试都没有问题,最近我们做支付的动态库里自己 加了一个校验机制,用到了MD5的加密校验,引用当时的签名字符串,在我android4.3的虚拟机里测试没有问题,后来安装到我的手机android7.0后发现最后生成的MD5与原来的不一致了,发现在生成类的属性时多了一项为serialVersionUID的列,那我们来重新修改一下代码。

测试过程

首先看一下我们建的类

里面只有两个属性 merid和appid

然后是SignStr函数

这个就是我们前文中《【干货】Android根据类生成签名字符串》说的到方法,这里就不再细讲了。

我们运行跟踪看一下

程序中输入我们的字符,然后运行跟踪

看到上面红框的里蓝色标里面多了一个serialVersionUID=,进入这个函数看到下图,里面获取的fields里面多了这么一个属性

知道原因后我们就修改一下这个方案

我们在加一判断是serialVersionUID和change两个判断,解决这个问题。

核心代码

public class SignHelper {

public static String Signstr(T t){

String str = "";

//定义属性名列表

List lstfieldname = new ArrayList();

//获取当前类里的所有属性

Field[] fields = t.getClass().getFields();

//遍历所有属性并把属性名称写入到List中

for (Field field : fields) {

//判断是我们自己定义的属性名再写入

if (!field.isSynthetic()) {

if (!(field.getName().equals("change") || field.getName().equals("serialVersionUID"))) {

lstfieldname.add(field.getName());

}

}

}

//对Lst进行ASCII码进行排序

Collections.sort(lstfieldname);

//根据排序后的名称我们开始拼接字符串

for (String fieldname : lstfieldname) {

//获取属性值

String fieldvalue = "";

try {

fieldvalue = (String) t.getClass().getField(fieldname).get(t);

} catch (Exception e) {

e.printStackTrace();

}

str = str + fieldname + "=" + fieldvalue + "&";

}

//去掉字符串的最后一个&符号

str = str.substring(0, str.length() - 1);

return str;

}

}

上面标红色的部分就是我们进行修改的,在度娘上查了一下,有些类也会多出来change这一属性,所以我们为了防止以后如果出现这个情况,直接就加上判断了

-END-

长按下方二维码关注微卡智享

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180730G0CWP100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券