一、登录
1.1 说明信息
需要登录以获取 jwt 和 Security_code,访问接口最少保留4项headers,其中 Authorization 为固定值。
| header | 值 | 备注 |
|---|---|---|
| Authorization | YKC-AUTHORIZATION | 此项不对则提示:开发商标识认证失败 |
| Cipher-Type | 2 | 值1默认密钥,值2新计算密钥。此项不对可能提示:客户端版本过低 |
| Head_token | 1080,x.y.z | 此项不对则提示: 未登录或登录过期 |
| Security_code | 1722561172319 | 与 Head_token 配合使用,提示亦同。 |
1.2 通过 sso 登录步骤
- GET
ssoLogin获取初始 Cookie,并跟踪 302 重定向获取跳转地址; - POST 统一身份账户密码(密码用base64编码)以及OTP到上一请求重定向到的地址,获取 SSO 的 token;
- POST
api/basic-auth-mos/SSO/SAML2/POST获取 accessToken(jwt格式) - GET
auth/toLogin获取新能源网站的 accessToken - GET
toSSOLogin换取新能源网站的 token - POST
exchangeWebKey发送新sm4-key到服务器进行认证,后续加密用此key
二、访问接口获取数据
2.1 payload
payload 最少保留以下参数(header 和 body 为空时不能删除键)。
|
|
2.2 生成 nonce
取 4 位 ascii 字符。
新能源系统的生成算法为:Math.random().toString(24).substr(2, 4),即随机小数按24进制形式转字符串,然后取紧跟小数点后4位。
2.3 计算 sign
payload.body + timestamp + nonce,然后计算sm3
比如:{}1722581739000aokk 的 sm3 是 d00f9525c288e524d343fc02d38739cd8d2fa6ac470685af4f1776e6e375f4d1
拼接时,如果payload中有参数,应当使用双引号并去空格,推荐使用:json.dumps(payload_body, separators=(',', ':'))
经测试,服务端未校验 sign
2.4 sm4 key 的生成和认证
- 随机生成 32 位16进制的数字新 sm4-key
- 使用 #1.2章节步骤5请求响应中的 pubKey,通过 sm2 加密算法加密新 sm4-key
- 和上述响应中的 accountId、securityCode 一起发送给服务器进行认证
- 后续加密使用新 sm4-key
2.5 payload 的加密
- 未认证新密钥前,使用 86C63180C2806ED1F47B859DE501215B,通过 sm4 加密,Cipher-Type 置 1
- 认证新密钥后,使用新 sm4-key,通过 sm4 加密,Cipher-Type 置 2
X. 新能源系统JS中常量密钥
|
|
Y. 完整 payload 样例
payload 中换行(格式化)后再加密不影响服务端识别。
|
|
在浏览器访问新能源系统时,JS会将认证后的新密钥使用默认密钥通过SM4加密后存放在 session storage 中,变量名为:randomkey,
在分析取数接口时,可提取该 randomkey,使用默认密钥通过SM4解密发送的payload以获取明文。
Z. JS中相关函数摘录
新 sm4-key 的 sm2 加密:
|
|
相关加密函数:
|
|