解密小红书授权登录x-s值

2,794 阅读3分钟

需求背景:由于小红书没有对外开放管理用户的文章等API,因此需要将小红书的“创作者平台”的API搬到自己的系统上;同时为了方便对用户的统一管理,也需要将授权搬移到自己的系统中;而授权中有一个查询扫码是否成功的接口请求中包含加密的内容X-s值

为了方便读者了解全程,我这里把授权的相关的过程都描述一下

  • 第一步,拿到生成二维码的逻辑,以及找到二维码里面的内容是啥,可以很容易地分析到,生成二维码的接口如下:

image.png

其中,qrUrl就是二维码的内容,因此这里可以自行调用这个接口来生成二维码,这一步是很容易的;

  • 第二步,可以看到有一个“queryQRCodeStatus”的接口请求,这个就是我今天解决的重点内容,如下截图,可以看到header里面有一个x-s的参数和x-t参数(x-t很容易理解是一个时间戳)

image.png

  • 第三步,就是寻找这个x-s的值了,一般来讲,首先是搜索站点的所有源文件,结果并未找到相关的内容;这个时候就需要转换思路了;我们可以搜索接口,结果很容易发现调用接口的位置,如下图:

image.png

接下来就根据“QR_STATUS_GET”找到调用接口的位置,如下:

image.png

然后,我们可以开始打断点,逐步查找我们需要的x-s的值,我解密过很多类似的站点,但是小红书这个确实有点难度,需要一定的实践经验,才能做得到,最终找到了生成x-s的地方,如下图:

image.png

最后进入到sign方法中,得到了js代码,大概如下:

image.png

逐步分析这个文件,发现其实还是比较简单,其中是一个md5的算法和另外一个叫不上名字的算法处理;最终也发现了,其实x-s这个参数是被转成了十六进制的形式了,所以整个源文件搜索是找不到内容的,如下图:

image.png

  • 第四步,也是比较关键的一步,把js代码转为PHP代码,这里其实可以直接把上面截图的sign算法整个文件封装一下,放到自己的项目,通过js计算x-s值也是可以的,我这里转为PHP代码,给大家作为一个参考:
function sign(string $str = 'test', string $o = 'A4NjFqYu5wPHsO0XTdDgMa2r1ZQocVte9UJBvk6/7=yRnhISGKblCWi+LpfE8xzm3')
{
   $time = microtime(true) * 1000;
   $str = md5($time . $str);
   $var14 = 0;
   $var7 = '';
   while ($var14 < strlen($str)) {
      $var1 = ($var9 = ord(substr($str, $var14++, 1))) >> 2;
      $var2 = (3 & $var9) << 4 | ($e = ord(substr($str, $var14++, 1))) >> 4;
      if ($var14 > strlen($str)) {
         $e = '';//非数字
      }
      $var8 = (15 & $e) << 2 | ($n = ord(substr($str, $var14++, 1))) >> 6;
      $var9 = 63 & $n;
      if ($var14 >= strlen($str)) {
         $n = '';//非数字
      }
      !is_numeric($e) ? ($var8 = $var9 = 64) : (!is_numeric($n) && ($var9 = 64));
      $var7 .= substr($o, $var1, 1) . substr($o, $var2, 1) . substr($o, $var8, 1) . substr($o, $var9, 1);
   }
   return ['X-s' => $var7, 'X-t' => $time];
}

这里要特别说明一下,上面的sign函数的$o参数是js的sign方法那个文件里面提供的(_0x1ce8[59])。到这里,基本就实现了这个sign方法了; 后续就只是一些七七八八的小事情。

到这里基本就结束了,后续会不定期更新相关网站的解密过程 -_-

“JS代码地址:code.juejin.cn/pen/7126727…