zoukankan      html  css  js  c++  java
  • QQ网页密码加密解析

    自从发布了上篇文章自这篇,隔了好长时间。

    就是因为被腾讯的网页登陆加密给难住了。模拟登录只好延期发布,这篇介绍一下腾讯网页登陆的加密机制。

    先介绍一下有关加密的信息:

    1、打开http://xiaoyou.qq.com/

    2、开启fiddler监听HTTP包

    3、登录QQ,我这里就随手写了个QQ:123456密码123456验证码efta

    U代表QQ号

    P代表加密后的密码

    verifycode代表验证码

    其余都是固定的,不叙述了

    要登录农场,必须要模拟发送以上数据来登录校友,而密码必须加密成如上才能通过验证。

    现在讲解一下如何把明文的1234加密成09967317CCFC266ADA83C9B1BEA30825(这么恶心的密码)

    这个是腾讯加密的JavaScript脚本 密码加密JavaScript

    初步看了一下觉得相当之恶心,所以在网上搜索了半天找到的一点线索就是  3次MD5加密后转换大些 + 验证码转换大写,再次MD5加密

    可是我按照这方法试了得到的结果却不是正确的。百思不得其解,求助了园子里认识的朋友,他给我发了段C#的代码,确实可以得到正确的。代码如下:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Security.Cryptography;
    using System.Text.RegularExpressions;
    using System.Collections;

    namespace QQ校友助手
    {
        class QQPassword
        {
            public static string binl2hex(byte[] buffer)
            {
                StringBuilder builder = new StringBuilder();
                for (int i = 0; i < buffer.Length; i++)
                {
                    builder.Append(buffer[i].ToString("x2"));
                }
                return builder.ToString();
            }
            public static string md5_3(string input)
            {
                MD5 md = MD5.Create();
                byte[] buffer = md.ComputeHash(Encoding.Default.GetBytes(input));
                buffer = md.ComputeHash(buffer);
                buffer = md.ComputeHash(buffer);
                return binl2hex(buffer);
            }

            public static string md5(string input)
            {
                byte[] buffer = MD5.Create().ComputeHash(Encoding.Default.GetBytes(input));
                return binl2hex(buffer);
            }

            public static string getPassword(string password, string verifycode)
            {
                return md5(md5_3(password).ToUpper() + verifycode.ToUpper()).ToUpper();
            }


        }
    }

    Encoding.Default.GetBytes(input)获取的是字符串的ASCII码

    用VS跟踪调试了好久,发现问题出在 C#的computehash是初级hash,得到的并不是16进制的MD5字符串,需要经过binl2hex才能转换成MD5字符串。也就是说初级hash了3次,才合并大写验证码进行最后一次MD5加密。

    知道了原理后,我改成Delphi源码:

    function Tfrm2.getKey: string;
    var
      hash: T4x4LongWordRecord;
      hashstr: string;
    begin
      SetLength(hashstr, 16);
      with TIdHashMessageDigest5.Create do
      begin
        hash := HashValue(edt2.Text);    //edt2.Text为QQ密码
        Move(hash, hashstr[1], 16);
        hash := HashValue(hashstr);
        Move(hash, hashstr[1], 16);
        hashstr := AsHex(HashValue(hashstr));
        Result := hashstr;
        Free;
      end;
    end; 以上代码可以得到09967317CCFC266ADA83C9B1BEA30825这加密后的字符串

    希望对QQ密码加密的分析对大家有启发!

  • 相关阅读:
    软件总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    3.22
    3.21
    3.20
  • 原文地址:https://www.cnblogs.com/lojon/p/1593108.html
Copyright © 2011-2022 走看看