习讯云-实习管理平台协议登录与逆向分析
习讯云-实习管理平台(
xixunyun.com)网页端登录流程的逆向分析。
1. 背景与抓包定位
习讯云是许多高校用于学生毕业实习、顶岗实习签到与日报填报的综合管理平台。在进行协议自动化对接或二次开发时,首先需要解决登录态认证问题。
打开浏览器访问习讯云登录页面并打开 DevTools(Network 面板),输入账号与密码发起登录,可以捕获到关键认证请求:
- 请求 URL:
https://api.xixunyun.com/login/admin - 请求方法:
POST - 数据格式:
application/x-www-form-urlencoded;charset=UTF-8

查看 Payload(Form Data),提交的表单字段如下:
| 字段名 | 示例值 | 说明 |
|---|---|---|
school_id | 2*** | 学校对应的唯一数字标识 ID |
j_data | MTIzMTMxMzsxMzEzMTMxMzsx | 加密/编码后的认证凭据数据 |
type | web | 客户端来源类型(网页端固定为 web) |
alg | en001 | 前端标记的加密算法版本编号 |
可以看到,登录并未直接明文传输密码,而是将账号凭据打包进了 j_data 字段,且标注算法为 alg: en001。
2. 前端逆向与算法溯源
为了弄清 j_data 的生成逻辑与 en001 究竟代表何种加密算法,我们在 DevTools 的 Sources 面板中搜索关键字 j_data 或 en001,或者审查页面加载的 JS 文件。
在资源目录结构中,可以清晰地看到前端脚本的分布:

在 js/functionjs/ 目录下发现了 base64.js,并在登录逻辑代码中定位到 j_data 的构造过程。
2.1 逆向解码验证
我们将抓包截获的 j_data 值:
MTIzMTMxMzsxMzEzMTMxMzsx放入 Base64 解码工具中进行测试:

解码结果为:
1231313;13131313;1对照输入数据:
- 前半段
1231313为登录账号(用户名/学号/手机号); - 中间段
13131313为用户登录密码; - 末尾固定追加分号与数字
1(表示登录用户身份类型或默认角色)。
2.2 编码规则总结
所谓的 alg: "en001" 实际上只是标准 Base64 编码,并未引入非对称加密(如 RSA)或对称加密(如 AES/DES),也未加盐或混淆。
其生成规则极其简洁:
raw = `${account};${password};1`j_data = Base64Encode(raw)3. 认证流程梳理
整个登录与鉴权流程如下:
4. 脚本实现
4.1 综合核心代码 (JavaScript / Node.js)
以下为提取并整理的完整登录与解析脚本:
const schoolId = "学校代码";const account = "账户";const password = "密码";
// 1. 拼接认证数据并进行 Base64 编码const raw = `${account};${password};1`;const jData = Buffer.from(raw, "utf8").toString("base64");
console.log("账号:", account);console.log("j_data:", jData);
// 2. 发起登录请求const response = await fetch("https://api.xixunyun.com/login/admin", { method: "POST", headers: { "Accept": "application/json, text/javascript, */*; q=0.01", "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", "Referer": "https://www.xixunyun.com/" }, body: new URLSearchParams({ school_id: schoolId, j_data: jData, type: "web", alg: "en001" }).toString()});
// 3. 处理并打印响应数据const text = await response.text();try { const result = JSON.parse(text); console.log(JSON.stringify(result, null, 2)); console.log("message:", result.message); console.log("data:", result.data);} catch { console.log("返回内容不是 JSON");}4.2 Python 实现参考 (Requests)
import base64import requests
def login_xixun(school_id: str, account: str, password: str) -> dict: url = "https://api.xixunyun.com/login/admin"
# 1. 拼接并进行 Base64 编码 raw_str = f"{account};{password};1" j_data = base64.b64encode(raw_str.encode("utf-8")).decode("utf-8")
headers = { "Accept": "application/json, text/javascript, */*; q=0.01", "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", "Referer": "https://www.xixunyun.com/" }
payload = { "school_id": school_id, "j_data": j_data, "type": "web", "alg": "en001" }
response = requests.post(url, headers=headers, data=payload) try: return response.json() except Exception: return {"error": "返回内容不是 JSON", "raw": response.text}
if __name__ == "__main__": result = login_xixun("学校代码", "账户", "密码") print(result)5. 实战调试与响应解析
运行上述脚本进行登录测试,成功获取到服务端的 JSON 响应:

接口返回的关键字段说明:
{ "pop_form": "1", "default_webview_domain": "https://www.xixunyun.com/", "dcwj_webview_domain": "https://dcwj.xixunyun.com/", "differ_api": "", "qxiao_api": "", "user_type_name": "学生", "user_qq": "", "user_one_family": "", "user_one_family_phone": "", "user_two_family": "", "user_two_family_phone": "", "user_birthday": "", "user_birthplace": "", "user_email": "", "user_phone": "", "point": "0"}user_type_name:当前登录账号的身份(如学生、教师等);default_webview_domain/dcwj_webview_domain:平台业务系统与问卷调查系统的 WebView 基础域名;- 响应头中还会下发会话 Cookie / Token,用于后续接口(如打卡签到、提交实习周报/日报)的鉴权。
6. 安全性分析与总结
- 伪加密:
alg: en001命名虽然形似加密算法版本,但实质上仅使用了明文 Base64 编码。Base64 不具备保密性,任何中间节点或日志捕获均可直接还原出明文密码。 - 缺少防重放机制:请求中未加入时间戳(Timestamp)、随机数(Nonce)或签名摘要(Sign),请求包具有永久重放风险。
- 无验证码保护:网页端默认未强制开启图形验证码或滑块验证码,易遭受撞库与暴力破解攻击。
总结
习讯云网页端的登录认证非常直观,核心在于将 ${account};${password};1 经 Base64 编码后作为 j_data 提交给 /login/admin 接口。为后续实现自动化签到、实习报表等脚本。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!



