qq空间登录参数详细分析及密码加密最新版

本文详细分析了QQ空间的登录过程,包括访问手机版QQ空间获取cookie,检查账号是否需要验证码的步骤,以及登录时的密码加密机制。在检查账号阶段,通过特定URL进行验证,并使用特定的加密函数对密码进行处理。密码加密涉及到两个关键参数,来自账号检查步骤的返回值。了解这一过程对于理解QQ空间的登录机制至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QQ空间登录全解析

一. 首先访问QQ空间手机版。

手机版提交的参数会少些 方便我们分析。

https://m.qzone.com/ 这个地址会有一个302跳转  而且这个域名是没有任何参数的 所以日后操作会很方便 访问这个页面的主要目的也就是为了要cookie而已

二.检查账号。

正常操作会自动进行这一步骤  主要目的是为了检查账号是不是需要验证码。https://ssl.ptlogin2.qq.com/check?pt_tea=2&uin=用户名&appid=549000929&ptlang=2052&regmaster=&pt_uistyle=9&r=0.10075433968427405&pt_jstoken=2421886501    这里的r是随机值  后面的jstoken经过测试 好像没有什么意义 随便给什么值都可以通过.

ptui_checkVC('0','!ZWR','\x00\x00\x00\x00\x16\x11\xab\x6e','f39cd53543fb2ce73b3c228ad53cf165326bbda1057cad2e200a62e3590cf92e75fb81c3de6fd9758291de82cb506c320a1eca7a71482e80','2') 

第一个0代表不需要验证码,如果是1代表需要验证码 会走另一个流程.第二个参数和第三个参数会带入到密码加密中进行运算.

三.登录。

https://ssl.ptlogin2.qq.com/login?pt_vcode_v1=0&pt_verifysession_v1=第二步返回值的第四个参数&verifycode=第二步返回值中的第二个参数&u=用户名&p=登录密码加密&pt_randsalt=2&ptlang=2052&low_login_enable=0&u1=https%3A%2F%2Fh5.qzone.qq.com%2Fmqzone%2Findex&from_ui=1&fp=loginerroralert&device=2&aid=549000929&daid=5&pt_ttype=1&pt_3rd_aid=0&ptredirect=1&h=1&g=1&pt_uistyle=9&regmaster=&

 

密码加密分析.

首先使用firefox 输入地址m.qqzone.com  点击 点击登录 

可以看到如上函数

 因为他中间会各种跳  反正最后的位置会在这里 像下面那个submit 不管是pc还是移动端都是一样的几乎 

至于这个移动端的详细跟踪路径 如果有同学跟踪出来的希望可以留个言 学习下

 持续跟随后发现 我们来到这里 

可能有的朋友看到这里会感觉乱 这个正常  我为什么知道这个地方呢  因为pc端和手机端的提交函数是一样的 分析pc端的时候 知道 提交函数是叫submit

然后可以看到 这个就是加密函数了

window = {};
window.$ = {}
window.$pt ={};
var navigator = {};
navigator.appName = "navigator";
navigator.appVersion = "5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36";

$ = window.$ || {},
$pt = window.$pt || {},
$.RSA = $pt.RSA = function() {
    function t(t, e) {
        return new a(t,e)
    }
    function e(t, e) {
        if (e < t.length + 11)
            return uv_alert("Message too long for RSA"),
            null;
        for (var n = new Array, o = t.length - 1; o >= 0 && e > 0; ) {
            var i = t.charCodeAt(o--);
            n[--e] = i
        }
        n[--e] = 0;
        for (var r = new Y, p = new Array; e > 2; ) {
            for (p[0] = 0; 0 == p[0]; )
                r.nextBytes(p);
            n[--e] = p[0]
        }
        return n[--e] = 2,
        n[--e] = 0,
        new a(n)
    }
    function n() {
        this.n = null,
        this.e = 0,
        this.d = null,
        this.p = null,
        this.q = null,
        this.dmp1 = null,
        this.dmq1 = null,
        this.coeff = null
    }
    function o(e, n) {
        null != e && null != n && e.length > 0 && n.length > 0 ? (this.n = t(e, 16),
        this.e = parseInt(n, 16)) : uv_alert("Invalid RSA public key")
    }
    function i(t) {
        return t.modPowInt(this.e, this.n)
    }
    function r(t) {
        var n = e(t, this.n.bitLength() + 7 >> 3);
        if (null == n)
            return null;
        var o = this.doPublic(n);
        if (null == o)
            return null;
        var i = o.toString(16);
        return 0 == (1 & i.length) ? i : "0" + i
    }
    function a(t, e, n) {
        null != t && ("number" == typeof t ? this.fromNumber(t, e, n) : null == e && "string" != typeof t ? this.fromString(t, 256) : this.fromString(t, e))
    }
    function p() {
        return new a(null)
    }
    function s(t, e, n, o, i, r) {
        for (; --r >= 0; ) {
            var a = e * this[t++] + n[o] + i;
            i = Math.floor(a / 67108864),
            n[o++] = 67108863 & a
        }
        return i
    }
    function c(t, e, n, o, i, r) {
        for (var a = 32767 & e, p = e >> 15; --r >= 0; ) {
            var s = 32767 & this[t]
              , c = this[t++] >> 15
              , u = p * s + c * a;
            s = a * s + ((32767 & u) << 15) + n[o] + (1073741823 & i),
            i = (s >>> 30) + (u >>> 15) + p * c + (i >>> 30),
            n[o++] = 1073741823 & s
        }
        return i
    }
    function u(t, e, n, o, i, r) {
        for (var a = 16383 & e, p = e >> 14; --r >= 0; ) {
            var s = 16383 & this[t]
              , c = this[t++] >> 14
              , u = p * s + c * a;
            s = a * s + ((16383 & u) << 14) + n[o] + i,
            i = (s >> 28) + (u >> 14) + p * c,
            n[o++] = 268435455 & s
        }
        return i
    }
    function l(t) {
        return st.charAt(t)
    }
    function d(t, e) {
        var n = ct[t.charCodeAt(e)];
        return null == n ? -1 : n
    }
    function h(t) {
        for (var e = this.t - 1; e >= 0; --e)
            t[e] = this[e];
        t.t = this.t,
        t.s = this.s
    }
    function f(t) {
        this.t = 1,
        this.s = t < 0 ? -1 : 0,
        t > 0 ? this[0] = t : t < -1 ? this[0] = t + DV : this.t = 0
    }
    function g(t) {
        var e = p();
        return e.fromInt(t),
        e
    }
    function w(t, e) {
        var n;
        if (16 == e)
            n = 4;
        else if (8 == e)
            n = 3;
        else if (256 == e)
            n = 8;
        else if (2 == e)
            n = 1;
        else if (32 == e)
            n = 5;
        else {
            if (4 != e)
                return void this.fromRadix(t, e);
            n = 2
        }
        this.t = 0,
        this.s = 0;
        for (var o = t.length, i = !1, r = 0; --o >= 0; ) {
            var p = 8 == n 
### Java通过SMTP和POP3协议操作QQ邮箱 #### 1. 使用JavaMail API发送邮件 要通过Java向QQ邮箱发送邮件,可以利用JavaMail库中的`Session`对象配置SMTP服务器参数并创建消息。以下是具体代码示例: ```java import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class SendEmailExample { public static void main(String[] args) { String host = "smtp.exmail.qq.com"; // QQ企业邮SMTP服务器地址 [^3] final String user = "your_email@example.com"; final String password = "your_password"; Properties props = new Properties(); props.put("mail.smtp.host", host); props.put("mail.smtp.port", "587"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, password); } }); try { MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(user)); message.addRecipient(Message.RecipientType.TO, new InternetAddress("recipient@example.com")); message.setSubject("测试邮件主题"); message.setText("这是一封来自Java程序的测试邮件。"); Transport.send(message); System.out.println("邮件已成功发送!"); } catch (MessagingException e) { e.printStackTrace(); } } } ``` 此代码片段展示了如何设置SMTP连接属性以及构建一封简单的纯文本邮件。 --- #### 2. 接收邮件功能实现 接收邮件可以通过POP3协议完成。下面是一个读取QQ邮箱中未读邮件的例子: ```java import com.sun.mail.pop3.POP3Store; import javax.mail.*; import javax.mail.internet.MimeMultipart; import java.io.IOException; import java.util.Properties; public class ReceiveEmailExample { public static void main(String[] args) throws Exception { String popHost = "pop.exmail.qq.com"; // POP3服务器地址 [^3] final String username = "your_email@example.com"; final String password = "your_password"; Properties properties = new Properties(); properties.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); [^1] Session emailSession = Session.getDefaultInstance(properties); Store store = emailSession.getStore("pop3s"); store.connect(popHost, username, password); Folder inboxFolder = store.getFolder("INBOX"); inboxFolder.open(Folder.READ_ONLY); Message[] messages = inboxFolder.getMessages(); for (int i = 0; i < messages.length; i++) { Object content = messages[i].getContent(); if (content instanceof String) { System.out.println(content.toString()); } else if (content instanceof MimeMultipart) { handleMultipart((MimeMultipart) content); // 处理附件或其他复杂内容 } System.out.println("-----------------------------------"); } inboxFolder.close(false); store.close(); } private static void handleMultipart(MimeMultipart mimeMultipart) throws MessagingException, IOException { int count = mimeMultipart.getCount(); for (int i = 0; i < count; i++) { System.out.println(mimeMultipart.getBodyPart(i).getContent().toString()); } } } ``` 该部分实现了基本的邮件读取逻辑,并支持解析多部分内容(如HTML正文或附件)。 --- #### 3. Maven依赖项 为了运行以上代码,需确保项目中引入了必要的依赖包。以下是最新的依赖声明方式[^4]: ```xml <dependencies> <!-- 必须引入的核心依赖 --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> <version>2.0.1</version> </dependency> <!-- HTTP客户端可选项 --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> </dependencies> ``` 注意:如果使用的是较新版本的Jakarta EE标准,则应替换旧版`javax.*`命名空间为`jakarta.*`。 --- #### 4. 常见问题排查 - **认证失败**:确认用户名密码无误;如果是QQ个人账号而非企业号,请开启IMAP/POP服务权限。 - **SSL/TLS错误**:检查是否正确设置了加密套接字工厂类 `javax.net.ssl.SSLSocketFactory` [^1] 和启用了TLS协议。 - **超时异常**:网络不稳定可能导致请求中断,建议调整超时时间或者更换更稳定的环境重试。 ---
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值