如何调用99%的知乎网页端API知乎逆向zse96 v2签名算法Rust实现深度解析【免费下载链接】zhihu-plus-plusZhihu | 知乎: Ad-free, low cost, AI powered zhihu android 3rd-party client. 去广告、占用低、AI大模型的新时代知乎安卓端体验项目地址: https://gitcode.com/gh_mirrors/zh/zhihu-plus-plus知乎Zhihu是一款免费、去广告、低占用的知乎第三方客户端支持 Android、macOS 和桌面端。它最硬核的能力之一是完整逆向了知乎网页端的zse96 v2 签名算法并用人人可审计的Rust 语言重新实现——这意味着知乎能像浏览器一样合法访问知乎网页端 99% 的 API 接口从而解锁搜索、话题、用户动态等大量原生 App 拿不到的数据。为什么知乎网页 API 需要签名用浏览器打开知乎任意页面如搜索、问题详情你会发现每个请求都带着三个特殊请求头请求头作用x-zse-93签名版本标识固定为101_3_3.0x-zse-96核心签名值格式为2.0_一长串密文x-requested-with模拟fetch请求来源服务器端会校验x-zse-96是否由当前 URL、你的设备 cookied_c0、请求体计算而来。签名对了网页端接口对你全部开放签名错了直接 403。这就是为什么很多第三方客户端只能调用 App 私有接口、功能受限而知乎可以做到网页级的完整体验。 关键洞察签名算法并非黑盒魔法而是藏在知乎前端加载的一个 JS 文件里仓库中保留了逆向样本 misc/zse-ck-v4-24df2abbfcb1b98cd5ce1b519f02eeabea28c83ac9d9ec2778dc5b03a3b8b710.js。知乎团队逐行读懂了它的混淆逻辑然后用 Rust 一行行还原。zse96 v2 签名算法全流程拆解整个签名可以浓缩成一条流水线共 4 步1️⃣ 拼装签名原文把 4 个要素用号拼接zse93 pathname d_c0 body其中pathname是请求 URL 去掉域名后的路径body为 POST 请求体GET 请求则为空。拼接逻辑在 ZhihuFetchSignature.kt 中不到 15 行代码。2️⃣ MD5 摘要对拼接结果做一次标准 MD5得到 32 位十六进制字符串。知乎的 ZhihuFetchSignature.kt 甚至手写了一个零依赖的 MD5 实现md5Hex函数保证跨平台行为完全一致。3️⃣ 自定义块加密算法核心这是整个算法最反常规的部分全部由 Rust 实现位于 rs-zse-sign/src/lib.rsZK密钥表32 个 32 位常量相当于加密算法的密钥轮ZB置换表256 字节的字节重排表配合左移 2/10/18/24 位的异或运算构成混淆函数g_transformr_block块加密把 16 字节输入扩展成 36 个字的寄存器组迭代 32 轮后取最后 4 字输出——结构上很像 AES 的轮函数但完全是知乎自研。多块数据之间还有链式依赖每块的密文都作为下一块的初始化向量见x_blocks函数 rs-zse-sign/src/lib.rs任何一块被篡改都会导致后续全部校验失败。4️⃣ 自定义 Base64 编码最后用一张乱序的 64 字符表6fpLRqJO8M/c3jnYxFkUVC4ZIG12SiH5v0mXDazWBTsuw7QetbKdoPyAlhN9rgE做类 Base64 编码并在编码时逐字节异或一个由常量58派生的滚动掩码见custom_encode函数 rs-zse-sign/src/lib.rs。即使你猜出了标准 Base64也解不开这层字符表掩码的双重伪装。最终拼上版本前缀就是你看到的请求头x-zse-96: 2.0_一段加密后的密文Rust 实现的三大亮点 双向加解密自带验签工具Rust 库不仅实现了encrypt_zse_v4加密签名还完整实现了逆运算decrypt_zse_v4解密验证位于 rs-zse-sign/src/decrypt.rs。配套的命令行入口 rs-zse-sign/src/main.rs 让你可以输入密文 → 自动识别并解密是调试签名问题的利器。⚡ JNI 桥接Android 零损耗调用rs-zse-sign/src/lib.rs 通过jni库导出Java_com_github_zly2006_zhihu_util_ZseRustSigner_encryptKotlin 侧一行external fun即可调用见 ZseSigner.kt。Rust 负责高性能字节运算Kotlin 负责业务组装各取所长。 单元测试守护正确性decrypt.rs 内置了三组测试ASCII 往返、中文 Unicode 往返、单块加解密互逆保证算法实现与网页端 JS 版本逐字节一致。在应用中的完整调用链知乎 App 发起 Web 请求时的完整链路非常清晰Kotlin 扩展函数signZhihuFetchRequest从 Cookie 中取出d_c0调用createZse96Header拼接原文并做 MD5通过 JNI 调用 Rust 的encrypt_zse_v4生成密文写入x-zse-96请求头请求发出。入口代码分布在 Utils.kt 和 WebviewComp.kt单元测试 ZhihuFetchSignatureTest.kt 会断言签名头以2.0_开头。自己动手编译运行 Rust 签名器克隆仓库即可在本地复现git clone https://gitcode.com/gh_mirrors/zh/zhihu-plus-plus cd zhihu-plus-plus/rs-zse-sign cargo run -- https://www.zhihu.com/api/v4/search_v3?qtest命令行工具会自动尝试解密若输入不是合法密文则原样输出加密结果。依赖只有一个jnicrate见 rs-zse-sign/Cargo.toml构建极快。模块路径速查模块路径Rust 签名/解密库rs-zse-sign/src/lib.rsRust 解密实现rs-zse-sign/src/decrypt.rsCLI 验证工具rs-zse-sign/src/main.rsKotlin 签名头组装shared/src/commonMain/kotlin/com/github/zly2006/zhihu/util/ZhihuFetchSignature.ktJNI 桥接入口shared/src/commonMain/kotlin/com/github/zly2006/zhihu/util/ZseSigner.kt逆向 JS 样本misc/zse-ck-v4-24df2abbfcb1b98cd5ce1b519f02eeabea28c83ac9d9ec2778dc5b03a3b8b710.js油猴脚本参考misc/tampermonkey.js总结知乎通过逆向知乎的zse-ck/v4JS 加密脚本拆解出原文拼装 → MD5 → 自研块加密 → 乱序表编码的完整 zse96 v2 签名流水线并用约 400 行 Rust 代码高保真复现了它。这套实现让一个开源第三方客户端突破了原生 API 的能力边界稳定调用网页端 99% 的接口——对于想学习接口逆向、密码学工程落地或 Rust 与 Android 互操作的同学来说rs-zse-sign/ 目录本身就是一份难得的教科书级案例。【免费下载链接】zhihu-plus-plusZhihu | 知乎: Ad-free, low cost, AI powered zhihu android 3rd-party client. 去广告、占用低、AI大模型的新时代知乎安卓端体验项目地址: https://gitcode.com/gh_mirrors/zh/zhihu-plus-plus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Reef模型权重训练实战:如何用Slime与SGLang让你的Agent模型越用越强 Reef模型权重训练实战:如何用Slime与SGLang让你的Agent模型越用越强 【免费下载链接】reef Continual learning infra for self-improving agents 项目地址: https://gitcode.com/gh_mirrors/reef7/reef
Reef 是首个面向自我进化 Agent 的开源持续学习基础设… · 2026/9/25 10:46:58
MySQL 4.1.18 老32位tar包部署指南:从解压到迁移的避坑实践 简介:这份资源是 MySQL 4.1.18 的 Linux 二进制安装包,面向需要在 i686 架构、glibc23 环境下部署数据库的初学者与运维人员,可用于搭建轻量级应用后台或学习关系型数据库的基础管理。压缩包共 1269 个文件,约 24.48MB,… · 2026/9/25 10:46:52
战网地区修改全攻略:Battle.net.config配置与避坑指南 1. 战网地区修改这件事,到底在改什么先把概念理清楚。暴雪战网的“地区”和“服务器”是两个不同层面的东西,很多人一上来就搞混,结果改了半天没效果,还以为是方法不对。战网客户端在启动的时候,会读取一个本地配置文件… · 2026/9/25 10:46:52
Sigmoid激活函数深度解析:从数学推导到梯度消失与工程实践 1. 从一个被问烂了的问题说起:为什么还要单独聊Sigmoid每次带新人入门机器学习,讲到神经网络的反向传播,总会有人问:现在大家都用ReLU了,Sigmoid是不是已经可以扔进历史垃圾桶了?这个问题我大概被问过不下五… · 2026/9/25 11:10:52
光模块从原理到选型:TOSA/ROSA、单模多模与光功率排查实战 1. 光模块到底是个什么东西第一次接触光模块的人,多半是被机房那一排排铁壳子插在交换机上、尾巴拖着一根黄线或者蓝线的场景给整懵的。我当年也是,看着师傅把一个小铁块“咔哒”一声塞进交换机笼子,然后拿一根细细的光纤连上去,几… · 2026/9/25 11:10:46
BrowserSkill:基于WebSocket的浏览器会话接管技术 1. 项目概述:这不是一个“插件”,而是一次浏览器会话控制权的移交Tencent BrowserSkill 这个名字乍看像某个腾讯出品的浏览器扩展,但实际它完全不是。我第一次看到这个标题时也下意识点开 Chrome 商店搜了一圈,结果什么都没找到—… · 2026/9/25 11:10:40
Mac Parallels闪退修复:codesign签名失效诊断与sudo深度修复 1. 项目概述:这不是崩溃,是签名失效的“温柔拒绝”Parallels Desktop 在 macOS 上突然退出、无法启动、双击图标后闪退几秒就消失——这种现象在 macOS 13 Ventura 及后续版本(尤其是 Sonoma 和 Sequoia)中高频出现,且… · 2026/9/25 11:10:39
MySQL农历公历对照表:两百年日历数据SQL脚本导入与查询 简介:面向需要处理公历与农历转换的MySQL开发者,这份压缩包提供了1900—2100年完整的公历表和农历表数据及建表脚本,适用于日历应用、事件管理、中国传统节日提醒等场景。资源仅包含1个SQL文件(jp_lunar_solar.sql)&am… · 2026/9/25 11:10:39
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37