小红书x-s参数加密逆向实战
⚠️ 免责声明:本文仅用于安全研究与技术交流,请勿将相关技术用于非法用途。恶意使用相关技术造成的一切后果由使用者自行承担。
目标站点:https://www.xiaohongshu.com/explore
概述
小红书Web端在API请求中使用X-S签名机制进行请求验证,本笔记完整记录了该签名机制的逆向分析过程,包括环境模拟、算法还原和完整实现。
逆向入口定位
我们首先通过浏览器开发者工具定位签名生成的入口:
- 打开小红书探索页,启动 DevTools 切换到 Network 面板
- 筛选 XHR/Fetch 请求,找到携带
X-S请求头的接口(例如首页 feed 接口/api/sns/web/v1/homefeed) - 在 Sources 面板中搜索
X-S关键字,或使用XHR/fetch Breakpoints断点拦截请求,回溯签名的生成逻辑
以下是分析过程中的关键截图参考:

核心签名流程分析
1. 签名生成步骤
通过分析,X-S的生成流程可分为以下几步:
- 将 API 路径与请求参数拼接为 JSON 字符串
- 计算该字符串的 MD5 值
- 调用
mnsv2算法,结合 MD5 值生成核心签名 - 组装包含版本、平台等信息的对象,经过 UTF-8 编码、自定义 Base64 编码后,加上
XYS_前缀得到最终X-S
2. 关键数据结构
最终组装的签名对象结构如下:
关键代码实现
1. 浏览器环境模拟
小红书的签名算法会检测浏览器环境,因此需要在 Node.js 中模拟常用的全局对象:
2. 核心签名函数
以下是签名生成的主逻辑:
3. 辅助编码函数
需注意小红书使用的 Base64 编码可能为自定义字典,以下为框架示例:
端到端调用示例
我们可以使用 Python 调用 Node.js 脚本生成签名,并发起实际请求。
1. Node.js 签名脚本(小红书.js)
将上述代码整合,并在最后输出结果:
2. Python 调用脚本
使用 Python 执行 Node.js 脚本,提取签名并发起请求:
关键注意事项
- 环境模拟完整性:
mnsv2算法通常依赖navigator、screen等对象的特定属性,缺失或错误会导致签名无效。 - JSON 序列化顺序:
JSON.stringify的参数顺序会影响 MD5 结果,需与浏览器端保持一致。 - 编码字典:Base64 编码可能使用非标准字典,需从逆向代码中确认。
- 版本与时效性:
x0版本号、mnsv2算法本身可能随站点更新而变化。
总结
小红书 Web 端的X-S签名通过“环境校验+多层编码+自定义算法”的组合保证安全性。完整实现该签名需要:精确模拟浏览器环境、正确构造请求参数、还原mnsv2核心算法,并严格遵循编码顺序。

