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实现的算法结果:


这就是完整的分析过程,通过详细的步骤,我们深入理解并实现了该登录算法的加密机制。希望对你有所帮助
感谢阅读本文,如有疑问或建议,请在评论区留言!



















