KS某聚星登录算法分析
- 某手某聚星登录算法分析
- 第一步:抓包-登录
- 第二步:定位加密入口
- 第三步:分析加密算法
- 第四步:算法实现
某手某聚星登录算法分析
在这篇文章中,我们将详细解析某手某聚星的登录算法,涵盖从抓包到定位加密入口、再到分析加密算法的每一步,最后通过Python实现整个加密过程。
第一步:抓包-登录
在抓包过程中,我们捕获到了如下请求,需重点关注的是 password 和 account 的加密算法。
第二步:定位加密入口
通过搜索 password 和 account,发现结果较多,改为直接搜索URL请求中的关键词 /loginAccount/v2。
这里搜索结果就1个
进去看看
看到在Fr函数中,看到熟悉的account和password,这个函数接受一个对象e作为参数,包含了用户的登录信息,包括phone、account、countryCode、password和captchaToken,直接下断点调试。
果然断下来了,为了理解Fr函数的完整功能,我们需要深入分析Hn函数
这个调用了Un和Fn函数,通过代码我可以看到:
调用Un函数:生成当前的时间戳,用于标记请求的时间。
调用Fn函数:生成一个长度为10的随机字符串,作为nonce,增加请求的唯一性和安全性。
通过调试我们发现调用Zn对象的encrypt方法分别对密码、账号、手机号和邮箱进行加密处理,至此,加密的核心入口找到了。
第三步:分析加密算法
继续深入分析Zn对象的encrypt方法
e.password是待加密的密码
n是包含时间戳和nonce的选项
公钥设置
var t = new Dn;
return t.setPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjWfCb9IR5pMheXLUHCQko8VddGGDZ2jN0Edj/yQoXl91plE6r/muh1oKeuWtSpDwqDDAO5s3lHYfPFb45eWTky0a4ijOBlGbls5WJBQqoqD3gYTPcZyc1KFmn9wRTbNLMFhWN2kCHzo6YOO9kRcCQdAuXaj2sxFrirdglL8v7I0gp0n2ME+3V4Jwiv86cL24t6DfzxHqW/CO7Q/7P6bE5xVZHkuup7J1vXrjewN0r9nXovmahYlLIop4QuWC6zDVHDSTk/SXifHJBidOgEWHKgQSC5FS3xism5bth8XKWu4WX/z2pND4vA4STNE9LwULQPX2MJFjqUdYG7fBePZnIwIDAQAB")
- t 是一个新的 Dn 实例,它可能是一个加密库的实例对象。
- 使用 t.setPublicKey 设置 RSA 公钥,这个公钥用于加密敏感信息。
加密方法 encrypt
encrypt 方法负责对输入数据进行加密:
encrypt: function(e, n) {
var r = n && n.format || "hex",
o = e;
- e 是待加密的字符串。
- n 是一个包含加密选项的对象,默认格式为 hex。
混合加密
如果指定 isMix 选项,则进行混合加密:
n && n.isMix && (o = function(e, t) {
var n = t && t.timestamp || Un(),
r = t && t.nonce || Fn(),
o = [n, r, e].join("_");
return {
timestamp: n,
nonce: r,
mixedText: o
}
}(e, n).mixedText);
- 生成时间戳(Un)和随机数(Fn)。
- 将时间戳、随机数和待加密字符串拼接在一起。
RSA 加密
var i = t.encrypt(o),
a = e,
s = !0;
- 使用 t.encrypt 方法对字符串进行 RSA 加密。
- 如果加密成功,i 将是加密后的字符串。
格式转换,根据选项转换加密后的字符串格式:
return i && (a = function(e, t) {
switch (t) {
case "base64":
return e;
case "hex":
return function(e) {
var t, n = "", r = 0, o = 0;
for (t = 0; t < e.length && "=" != e.charAt(t); ++t) {
var i = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(e.charAt(t));
i < 0 || (0 == r ? (n += jn(i >> 2),
o = 3 & i,
r = 1) : 1 == r ? (n += jn(o << 2 | i >> 4),
o = 15 & i,
r = 2) : 2 == r ? (n += jn(o),
n += jn(i >> 2),
o = 3 & i,
r = 3) : (n += jn(o << 2 | i >> 4),
n += jn(15 & i),
r = 0))
}
return 1 == r && (n += jn(o << 2)),
n
}(e);
default:
return t
}
}(i, r),
s = !1),
{
encryptText: a,
ignoreEncrypt: s
}
详细总结
-
对象初始化与公钥设置:
Zn 对象初始化时,通过 t.setPublicKey 设置了 RSA 公钥,用于后续的加密操作。
-
加密方法 encrypt:
接受两个参数:待加密字符串 e 和加密选项 n。
默认格式为 hex,但支持 base64 格式。
支持混合加密(将时间戳和随机数与原始字符串拼接后再加密)。 -
混合加密:
如果启用 isMix 选项,生成时间戳和随机数,并将它们与原始字符串拼接,然后进行加密。 -
RSA 加密:
使用 t.encrypt 方法对字符串进行 RSA 加密。 -
格式转换:
根据选项将加密结果转换为 hex 或 base64 格式。 -
返回值:
encryptText:转换后的加密文本。
ignoreEncrypt:指示是否忽略加密(在混合加密情况下为 false)。
第四步:算法实现
下面通过python实现的算法结果:
这就是完整的分析过程,通过详细的步骤,我们深入理解并实现了该登录算法的加密机制。希望对你有所帮助
感谢阅读本文,如有疑问或建议,请在评论区留言!