my-tv 央视频请求加密解析:你每换一次台,都在偷偷算签名
【免费下载链接】my-tv我的电视 电视直播软件,安装即可使用项目地址: https://gitcode.com/GitHub_Trending/my/my-tv
你在 my-tv 上按下换台的瞬间,应用已经在本地算好加密签名,再塞进发给央视频服务器的请求里。这套流程平时看不见,却是整个 App 能不能正常出画面的关键。
它到底在帮你解决什么?
如果你打开过抓包工具,会注意到一个现象:my-tv 并不是把频道地址直接甩给服务器,而是每次都带上一串 cKey、signature 这样的字段。
说白了,央视频这套接口是有"验货"环节的——请求里少一个字段、或者签名对不上,服务端就直接不给你流地址。Encryptor 负责的那块,就是替应用把这些"防伪凭证"算好的人。
背后是怎么跑起来的?📺
这块其实没你想的复杂,拆开看就三层。
第一层:算法为什么藏在 .so 里
Kotlin 这边的 Encryptor 其实是个空壳,init、encrypt、hash、hash2 四个方法全标了 external,真正干活的是 cpp 目录里按架构分好的 libnative.so。
你可以把它理解成:算法本体用 C 写死、编译进二进制库,Kotlin 只负责喊一声"帮我算"。这样即使有人反编译 APK,也只能看到一串调用,翻不到里面的具体运算。
第二层:cKey 和 signature 是怎么拼出来的
每次换台,YSP 先备齐几个原料:频道号 cnlid、当前时间、版本号、设备 guid、平台号,再随手造一个 10 位的 rand_str。
这些原料先喂给 encrypt 生成 cKey;同时把全部字段按固定顺序拼成一个查询串,交给 hash 得到 signature。换句话说,cKey 说明"我要看哪个台",signature 说明"这个请求没被中间人改过"。
// 换台请求里,这两个字段全靠 Encryptor 算出来 val cKey = encryptor.encrypt(cnlid, timeStr, appVer, guid, platform) val signature = encryptor.hash(按固定顺序拼好的字段串)第三层:guid 和 rand_str 这两个"防伪"细节
guid 是应用生成的设备指纹,首次写入 SP 后一直复用,让服务器认得"这是同一台电视"。
而 rand_str 和 timeStr 每次请求都换新,作用就是防重放——有人就算截获了一次请求,隔段时间重发也会因为对不上被拒。
跟着走一遍
- 打开 my-tv,进到一个央视频频道。
- 按遥控器上的"下一频道",应用读到新的 cnlid。
- 本地调用 encrypt 和 hash,当场算出 cKey 与 signature。
- 连同 guid、rand_str 一起打包成 JSON 发给服务端。
- 验签通过,返回流地址,画面就出来了。
几个值得留意的细节🔒
- 它并不是"密码锁"。单看 Encryptor 这个名字很容易联想到应用锁、存密码,但 SP 里实际只存了频道设置和设备 guid,没有任何密码字段——这层真正干的是给央视频请求做加密和签名。
- 加密底座大概率是 OpenSSL。cpp 目录里躺着 libcrypto、libssl 的 .so 和一整套头文件,应用基本是拿现成的 OpenSSL 来算,而不是自己手写算法。
- 两套 hash 各管一摊。hash 负责换台主请求的 signature,hash2 负责那串更短的鉴权签名,职责不混用。
- 算法本体看不到源码。到底是哪种哈希、encrypt 走的哪套密钥,都封在二进制里,只能从调用处反推用途。
想看清这套签名到底怎么算的,与其读文章,不如把 YSP.kt 从头到尾捋一遍,那里是整套逻辑的总开关。
【免费下载链接】my-tv我的电视 电视直播软件,安装即可使用项目地址: https://gitcode.com/GitHub_Trending/my/my-tv
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考