快手 sig(sign)签名算法 java版

声明:本博文只是作为研究学习用途,请不要用于非法、商业用途。

写个帖子不容易,转载请说明出处,谢谢

首先需要用Fidder抓包工具找到接口地址

这个过程省略,请参考这位博主的文章,我也是根据他的文章做的:
https://blog.csdn.net/bpp94_github/article/details/80038052

我是用的一个旧手机来进行抓包的

  1. 唯一有一点需要注意的是,我在安装证书的过程中(输入电脑ip+端口8888之后,点击了那个下载证书链接后),在手机浏览器下载管理中找到下载好的证书后,点击安装,居然提示我无法打开证书
  2. 几番百度后,找到了这个博主的帖子:
    https://blog.csdn.net/hanyu_aa/article/details/81356442
    注意:没有设置锁屏密码的话,安装的时候会提示输入凭据密码,这个时候需要先设置手机的锁屏密码,然后重启手机,再进行安装,输入锁屏密码后就搞定了

重点来了,快手所有的接口基本都用到了一个参数sig(数据签名)

接口传递的参数,用抓包工具可以看的很清楚,但是这个sig怎么来的,一脸懵逼

这个博主的帖子给了我一些灵感,但是还是不全对,地址贴出来:
https://blog.csdn.net/qq_26905283/article/details/46440215

从这个帖子中发现,计算方法是所有的参数进行一定的排序之后,再拼接上一个盐值(salt),用MD5加密得到的。
我这样做之后还是不对,有两个地方:
第一:不是所有的参数都参与排序加密;
第二:这个salt值怎么来的(没有去实验,猜测不同接口的salt有可能不一样或者隔一段时间之后该salt值会变化)
第一个问题:几经实验之后发现,所有的抓包参数除了sig和__NStokensig两个参数,其他参数都进行排序计算
第二个问题:这个salt值,我也没有搞清楚怎么来的(还望大神评论指点),我这里贴出获取粉丝数的这个salt值,其他的接口没有尝试(382700b563f4)

一下贴出我的代码:

public class SingatureUtil {

    private static final String FANS_SALT = "382700b563f4";

    public static String genSignature(Map<String,String> params,String salt) {
        if(params == null){
            return null;
        }
        String sign = "";
        StringBuffer sb = new StringBuffer();
        try {
            // 1. 字典升序排序
            SortedMap<String,String> sortedMap = new TreeMap<>(params);
            // 2. 拼按URL键值对
            Set<String> keySet = sortedMap.keySet();
            for(String key : keySet){
                //sign不参与算法
                if(key.equals("sig") || key.equals("__NStokensig")){
                    continue;
                }
                String value = sortedMap.get(key);
                sb.append(key + "=" + URLDecoder.decode(value,"UTF-8"));
            }
            String uriString = sb.toString();
            uriString = uriString + salt;
            System.out.println("My String: \n" + uriString);
            // 3. MD5运算得到请求签名
            sign = MD5Util.md5(uriString);
            System.out.println("My Sign:\n" +sign);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sign;
    }

    public static Map<String,String> getMapFromStr(String str){
        if(StringUtils.isEmpty(str)){
            return null;
        }
        String[] arr = str.split("\\&");
        Map<String,String> map = new HashMap<>();
        for(String item : arr){
            String[] itemArr = item.split("=",2);
            map.put(itemArr[0],itemArr[1]);
        }
        return map;
    }

    public static void main(String[] args) throws UnsupportedEncodingException {
        String srcStr = "app=0&lon=104.073269&did_gt=1551777466213&c=XIAOMI&sys=ANDROID_4.4.4&isp=&mod=Xiaomi%28MI%203%29&did=ANDROID_b07d34ee8ff226b0&hotfix_ver=&ver=6.1&net=WIFI&country_code=cn&iuid=&appver=6.1.2.8197&max_memory=192&oc=XIAOMI&ftt=&kpn=KUAISHOU&ud=1273257807&language=zh-cn&kpf=ANDROID_PHONE&lat=30.537794&user=74476707&token=6f8b8954c34e4462a1c0117ac5a5af21-1273257807&os=android&client_key=3c2cd3f3&sig=8ab207f1762b17b47d1ca0cc26ce6576&__NStokensig=334b7f77f9fec536c1dce00467f8cf79bed4f66cd8a24ffc205b3e1a151ab1e7";
        genSignature(getMapFromStr(srcStr),FANS_SALT);
    }
}

运行结果如下:
My String: 
app=0appver=6.1.2.8197c=XIAOMIclient_key=3c2cd3f3country_code=cndid=ANDROID_b07d34ee8ff226b0did_gt=1551777466213ftt=hotfix_ver=isp=iuid=kpf=ANDROID_PHONEkpn=KUAISHOUlanguage=zh-cnlat=30.537794lon=104.073269max_memory=192mod=Xiaomi(MI 3)net=WIFIoc=XIAOMIos=androidsys=ANDROID_4.4.4token=6f8b8954c34e4462a1c0117ac5a5af21-1273257807ud=1273257807user=74476707ver=6.1382700b563f4
My Sign:
8ab207f1762b17b47d1ca0cc26ce6576

Process finished with exit code 0

在这里插入图片描述
写个这个帖子也是希望能帮到需要的小伙伴,我也是百度找了好久都没有靠谱的帖子,翻墙google也没有,伤心啊。。。

评论 69
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值