某某会sign值分析
字数 1113 2025-08-29 08:30:12
某某会sign值分析技术文档
前言
本技术文档旨在分析某某会应用的sign值生成机制,通过逆向工程和抓包分析,揭示其API请求中的签名算法实现原理。文档包含抓包分析、脱壳技术、signature和random字段分析以及password字段加密等内容。
正文
1. 抓包分析
通过抓取某某会应用的网络请求,可以观察到以下关键请求参数:
POST /api/login HTTP/1.1
Host: xxx.com
Content-Type: application/x-www-form-urlencoded
username=testuser&password=encrypted_value&signature=xxxxxx&random=123456
关键参数说明:
username: 明文用户名password: 加密后的密码signature: 请求签名值random: 随机数
2. 脱壳技术
某某会应用使用了加固保护,需要先进行脱壳处理:
- 识别加固类型:使用查壳工具检测为某商业加固方案
- 脱壳方法:
- 使用Frida进行内存dump
- 通过动态调试找到dex加载点
- 使用Xposed模块拦截dex加载
- 关键代码定位:脱壳后搜索"signature"相关字符串,定位到签名生成类
com.xxx.security.SignUtils
3. signature和random字段分析
signature生成算法
逆向分析发现signature由以下参数生成:
public static String generateSignature(String username, String password, String random, long timestamp) {
String raw = username + "|" + password + "|" + random + "|" + timestamp;
return md5(sha256(raw + "固定盐值"));
}
算法特点:
- 使用管道符"|"连接各参数
- 采用双重哈希(MD5+SHA256)
- 包含固定盐值(逆向得到为"xxx_salt_2023")
- 时间戳为13位毫秒级
random字段
random字段为6位纯数字,服务端会校验其有效性:
- 服务端会维护一个随机数池
- 每个random有效期为5分钟
- 相同random不能重复使用
4. password字段分析
password字段采用AES加密,逆向得到加密流程:
public static String encryptPassword(String raw) {
String key = "固定密钥前缀" + DeviceUtils.getDeviceId();
byte[] iv = new byte[16]; // 全零IV
return Base64.encode(AES.encrypt(raw, key, iv));
}
加密特点:
- 密钥由固定字符串+设备ID组成
- 使用ECB模式(尽管有IV参数,实际未使用)
- 输出为Base64编码
- 设备ID通过
android.provider.Settings.Secure.getString()获取
5. 完整请求流程
- 客户端生成6位random
- 获取当前时间戳
- 使用设备相关密钥加密password
- 生成signature
- 发送包含上述参数的请求
- 服务端验证signature和random有效性
安全建议
-
签名算法:
- 建议使用HMAC替代简单的哈希拼接
- 盐值应定期更换或使用动态盐
-
加密改进:
- 避免使用设备ID作为密钥因子
- 应采用CBC或GCM等更安全的模式
- 实现密钥轮换机制
-
随机数:
- 增加随机数长度至至少16位
- 结合时间戳和密码学安全随机数生成器
总结
某某会的签名机制虽然实现了基本的请求验证,但在密钥管理和算法选择上存在改进空间。通过本分析,开发者可以理解其安全实现原理,并据此设计更健壮的API防护方案。