🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# **背景** 早已存在sdk、webapi版接口,为什么还推出UserApi接口,原因:sdk是dll,代码封装固定,开发者动不了,破解者喜欢hook sdk接口,不使用远程函数很容易通杀和山寨,而远程函数新手不懂使用;webapi虽然用https防抓包防修改,但是破解者不是从这里下手,喜欢断点https请求的系统api,容易定位加密前的数据和修改,从而破解和山寨。所以推出UserApi,UserApi加密数据不使用任何api,从而增加定位明文数据的成本,每人的加密key不一样(后台可修改),你想方设法把key保护起来是你最终的防破手段,当然,这涉及到很多逆向知识,如 反找栈数据、反找堆数据,这个靠你积累。其二,UserApi接口和参数设计较合理,用户可控性强,后端代码更健壮,可维护性好。 # **接口请求格式** **`例如:`** ``` http://1.5yyz.com/UserApi?appid=78&timestamp=1549432081000&data=00B1E2614920F33EF6902D4DCA938E0575B2F66C79230A5974E9BD04&sign=2264eec97efa368ee58c4362195c5172 ``` **`参数描述:`** | 参数名 | 类型 |必需|说明 | | --- | --- |---|---| | **appid** | 整数型 |是| 软件id,在后台查看 | | **timestamp** | 长整数型 |是| 时间戳,相差不能大于30秒,否则提示请求已过期 | |**data**|文本型|是|重要数据包,传入前先用safeCode加密,没加密前是JSON对象,对象属性因不同接口而不同,请看实际接口的文档,加密方法请看下面| |**sign**|文本型|是|参数md5签名,作用是防止篡改参数,签名方法请看下面| |**token**|文本型|否|与cookie功能一样,使用token则可以不用cookie,二者选一,如两者共存,后端则用token| **`请求方式:`** POST # **接口响应格式** **`例如:`** ``` {"data":"28D2DDEB8B106D95422E6CEE1B399A807FAEBA4E061F7D6CC7D7A2D22AE9E0C8F880DD7078AB967745AC","msg":"","status":1,"token":"b64e2dad-5ac1-455a-bf88-db5290342857"} ``` **`属性描述:`** | 属性名 | 类型 | 说明 | | --- | --- | --- | | **status** | 整数型 | 系统状态码,appid不对、签名错误、请求过期等等错误反馈到此属性,详情见status表| |**msg**|文本型|系统提示信息,一般情况返回空文本,status非0才有| |**token**|文本型|此属性初始化返回才有,实际上是cookie里session id,给其他业务接口传入| |**data**|文本型|重要数据包,status为1才有,返回是密文,要用customCode解密,解密后是JSON对象,对象属性因不同接口而不同,请看实际接口的文档| # **请求data加密** data原来是JSON对象,明文传输是不安全的,使用开源的RC4算法加密,密钥是该软件的`安全码`,在核盾后台软件列表查看。看下面加密效果。代码写法请参考[核盾论坛](http://bbs.5yyz.com/forum.php?mod=forumdisplay&fid=39)给出的例子。 密钥:`420581317` 加密前:`{"api":1,"userName":"112","password":"112","verifyCode":"","machineCode":"0"}` 加密后: ``` 00B1E2614920F33EEA9E7A53CE82A80D76B297393F77195174F5BD0907451EB88EEF567C8AC475AECAB4370BA82C5A75A9EB2D3F91C8EA72C71BBAECC09D36AE1A8DF43214548ED90945FA89C3 ``` # **响应data解密** data原来是JSON对象,明文传输是不安全的,使用开源的RC4算法解密,密钥是该软件的`自定义码`,在核盾后台软件列表查看。看下面解密效果。代码写法请参考[核盾论坛](http://bbs.5yyz.com/forum.php?mod=forumdisplay&fid=39)给出的例子。 密钥:`123` 解密前: ``` 28D2DCED811126C117533BA65C76D3D671B6FBF4A8C09A8427427D79832D63D0F6115CD3A9754AB0ED781C33CC064848D7C75DF7E4D30007BBE741 ``` 解密后: ``` {"code":208,"msg":"帐号已过期!","timestamp":1549448450434} ``` # **请求参数签名** `参数签名 = md5(appid + safeCode + timestamp + data密文)` 参考签名的顺序不能乱,签名后文本不区分大小写 # **注意事项** * UserApi任何一个接口都是固定格式,如本页文档定义,唯一变的是data对象里的属性。 * c1.5yyz.com域名是强制设置请求头引用页,Referer: *.5yyz.com/UserApi,否则返回403。 * 请求头内容类型要设置表单提交和设置编码GBK,Content-Type: application/x-www-form-urlencoded; charset=GBK * 请求头可以不附加cookie,但是要url要带token,二者选其一 * c1.5yyz.com域名是https,之前用户老问我用http还是https,对于UserApi接口不必纠结,因为请求本来是加密的。(用http减少核盾运营成本,https另外购买的)