Java 字典攻击破解MD5密码

概要:

MD5加密较为安全的原因是,攻击者即使通过攻击得到了密码,也难以通过该值反推出口令的值,因而无法登录系统。但是当口令的安全系数比较弱时,也就是说口令的位数很少时,攻击者很容易通过字典式攻击由密码反推出原有口令的值。

| |目录

技术要点

攻击MD5加密的技术要点如下:

  • 生成字符串组合。

  • 生成字典。

  • 保存字典。

代码实现

package net.xsoftlab.baike;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.PrintWriter;
import java.security.MessageDigest;

public class AttackMess {
	public static void main(String args[]) throws Exception {
        String password = "";

		// 生成MessageDigest对象
		MessageDigest md = MessageDigest.getInstance("MD5");
		// 传入需要计算的字符串
		md.update("nql".getBytes("UTF8"));
		byte b[] = md.digest();// 计算md5密码
		// 处理计算结果
		for (int i = 0; i < b.length; i++) {
			password += Integer.toHexString((0x000000ff & b[i]) | 0xffffff00).substring(6);
		}
		System.out.println("MD5加密密码为:" + password);

        MessageDigest m = MessageDigest.getInstance("MD5");
		PrintWriter out = new PrintWriter(new FileOutputStream("dictary.txt"));// 指定攻击MD5密码的字典
        /** 生成3位口令的字典 */
		for (int i1 = 'a'; i1 <= 'z'; i1++) {
			for (int i2 = 'a'; i2 <= 'z'; i2++)
				for (int i3 = 'a'; i3 <= 'z'; i3++) {
                    char[] ch = { (char) i1, (char) i2, (char) i3 };
                    String passwd = new String(ch);
                    m.update(passwd.getBytes("UTF8"));
                    byte s[] = m.digest();
                    String result = "";
                    for (int i = 0; i < s.length; i++) {
                        result += Integer.toHexString(
                                (0x000000ff & s[i]) | 0xffffff00).substring(6);
                    }
					out.print(passwd + ",");
                    out.println(result);
                }
        }
        out.close();
        Dictionary(password);// 破解传入摘要的口令
    }

	// 查看生成的字典是否包含给定的密码
	public static void Dictionary(String pass) throws Exception {
		String md, str;
		BufferedReader in = new BufferedReader(new FileReader("dictary.txt"));// 读取生成的字典
		while ((md = in.readLine()) != null) {
			if (md.indexOf("") != -1) {
				str = md.substring(md.lastIndexOf(",") + 1);// 取出消息摘要
				if (str.equals(pass)) {
					System.out.println("根据用户的Md5密码而破解的口令为:");
					System.out.println(md.substring(0, md.lastIndexOf(",")));// 输出口令
					break;
				}
			}
		}
		in.close();
	}
}

程序解读

  1. 在本程序中使用三重for循环生成三个字符的所有组合,为了能简单地演示功能效果,只考虑口令为小写字符a~z的情况。实际使用时,需考虑各种常用字符的各种组合。

  2. 在计算MD5密码、保存字典等一切操作完毕后,接下来就该运用此字典来破解那些安全系数较弱的口令。在本程序中以nql为例,讲解了破解的过程。由此可以看出,对于位数少的密码还是容易被攻击者破获的,所以在日常生活中,尽量将密码设得复杂些,不给那些不道德的人留一点机会。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消