暴力破解MD5的实现(MapReduce编程)

本文主要介绍MapReduce编程模型的原理和基于Hadoop的MD5暴力破解思路。

一、MapReduce的基本原理

Hadoop作为一个分布式架构的实现方案,它的核心思想包括以下几个方面:HDFS文件系统,MapReduce的编程模型以及RPC框架。无论是怎样的架构,一个系统的关键无非是存储结构和业务逻辑。HDFS分布式文件系统是整个Hadoop的基础。在HDFS文件系统之中,大文件被分割成很多的数据块,每一块都有可能分布在集群的不同节点中。也就是说在HDFS文件系统中,文件的情况是这样的:

文件保存在不同的节点上,而Hadoop是用于海量数据处理的,那么如何把分布在各个节点的数据进行高效的并发处理呢?Hadoop对此提供了不同的解决方案,比如yarn框架等。框架已经帮我们写好了很多的诸如任务分配,节点通信之类的事情。而我们要做的就是写好自己的业务逻辑,那么我们就要遵守Hadoop的编程规范,而这个编程规范就是MapReduce。

那么MapReduce的运行过程是怎么样的呢?且看下图:

1.从HDFS文件系统中读取文件,每一个数据块对应一个MapTask。

2.进行Map任务,逐行读取文件,每一行调用一次Map函数,数据被封装为一个键值对也就是图中的<k2,v2>。

3.将Map后的键值对进行归约,key值相同的value会被封装到一起。就行了图中的<k,{v1,v2,v3}>

4.归约后的键值对会被送到不同的Reduce中,执行Reduce任务,输出<k3,v3>到输出文件中。

弄懂了MapReduce的执行过程之后,我们就可以编写自己的逻辑来进行处理了。

二、MD5暴力破解的基本思路

还是先上图:

1.编程生成所有的密码明文文件。

2.将明文上传至HDFS文件系统中,在Map函数中实现MD5的求值。然后直接存入文件系统中中。

代码实现:

package com.test;

import java.security.MessageDigest;

import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
 * 目地很简单。不需要reduce处理,直接在Map中解决问题
 * @author hadoop
 *
 */
public class Test {
	//定义Map处理类
	static class TestMapper extends Mapper<LongWritable, Text, Text, Text>{
		//重写map方法
		public void map(LongWritable key, Text value, Context context)throws  InterruptedException {
		     try{
		    	 //生成MD5
		    	 String keyStr=value.toString();
		    	 String MD5=getMD5(keyStr);
		    	 context.write(new Text(keyStr), new Text(MD5));
		     }catch (Exception e){
		    	 e.printStackTrace();
		     }
		}
	}
/**
 * MD5计算
 * @param str
 * @return
 */
public static String getMD5(String str) {
    try {
        // 生成一个MD5加密计算摘要
        MessageDigest md = MessageDigest.getInstance("MD5");
        // 计算md5函数
        md.update(str.getBytes());
        // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
        // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
        byte[] encrypt = md.digest();
        StringBuilder sb = new StringBuilder();
        for (byte t : encrypt) {
        	String s = Integer.toHexString(t & 0xFF);
        	if (s.length() == 1) {
        	    s = "0" + s;
        	}
            sb.append(s);
        }
        String res = sb.toString();
        return res;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public static void main(String[] args) throws Exception {
    		//必须要传递的是自定的mapper和reducer的类,输入输出的路径必须指定,输出的类型<k3,v3>必须指定
            //将自定义的MyMapper和MyReducer组装在一起
            Configuration conf=new Configuration();
            String jobName=Test.class.getSimpleName();
            //首先写job,知道需要conf和jobname在去创建即可
            Job job = Job.getInstance(conf, jobName);
            //如果要打包运行改程序,则需要调用如下行
            job.setJarByClass(Test.class);
            //读取HDFS內容:设置输入路径
            FileInputFormat.setInputPaths(job, new Path(args[0]));
            //指定解析<k1,v1>的类(谁来解析键值对)
            //*指定解析的类可以省略不写,因为设置解析类默认的就是TextInputFormat.class
            job.setInputFormatClass(TextInputFormat.class);
            //指定自定义mapper类
            job.setMapperClass(TestMapper.class);
            //指定map输出的key2的类型和value2的类型  <k2,v2>
            //下面两步可以省略,当<k3,v3>和<k2,v2>类型一致的时候,<k2,v2>类型可以不指定
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(Text.class);
            //分区(默认1个),排序,分组,规约 采用 默认
//            job.setCombinerClass(null);
            //接下来采用reduce步骤
            //指定自定义的reduce类
//            job.setReducerClass(null);
            //指定输出的<k3,v3>类型
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(Text.class);
            //指定输出<K3,V3>的类
            //下面这一步可以省
//            job.setOutputFormatClass(TextOutputFormat.class);
            //指定输出路径
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
            //写的mapreduce程序要交给resource manager运行
            job.waitForCompletion(true);
     }

}

  

这里为什么不用Reduce过程?

Reduce是对归约后的键值对进行处理的,但是可以看见,我们的明文都是唯一的,经过Map后输出的键值对的Key都是不一样的,归约之后仍然如此,所以没有必要在Reduce过程中进行其他操作。

另外我之前的想法是不在map中处理,而是将Map中读取到的文件内容直接输出到Reduce,然后在Reduce中进行MD5的计算,但是从Map中传输过来的数据总会多出一些行,导致计算出错。(这个我也没能弄懂怎么回事,有大佬知道的可以靠诉我)

三、数据查询

有了上一步生成的数据,我们就可以做数据的查询了。生成的文件仍然是在HDFS文件系统中,通过终端输入参数(可以是明文或者是密文),然后用MapReduce进行查找,结果输出到文件中。

代码:

package com.test;

import java.security.MessageDigest;

import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
 * 目地很简单。不需要reduce处理,直接在Map中解决问题
 * @author hadoop
 *
 */
public class Test {
	private static String s=null;
	//定义Map处理类
	static class TestMapper extends Mapper<LongWritable, Text, Text, Text>{
		//重写map方法
		public void map(LongWritable key, Text value, Context context)throws  InterruptedException {
		     try{
		    	 //查询MD5的值
		    	int index=value.find(s);
		    	if(index>=0){
		    		System.out.println("=================="+value.toString());
		    		context.write(new Text("result"), value);
		    	}
		     }catch (Exception e){
		    	 e.printStackTrace();
		     }
		}
	}
/**
 * MD5计算
 * @param str
 * @return
 */
public static String getMD5(String str) {
    try {
        // 生成一个MD5加密计算摘要
        MessageDigest md = MessageDigest.getInstance("MD5");
        // 计算md5函数
        md.update(str.getBytes());
        // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
        // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
        byte[] encrypt = md.digest();
        StringBuilder sb = new StringBuilder();
        for (byte t : encrypt) {
        	String s = Integer.toHexString(t & 0xFF);
        	if (s.length() == 1) {
        	    s = "0" + s;
        	}
            sb.append(s);
        }
        String res = sb.toString();
        return res;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public static void main(String[] args) throws Exception {
    		//必须要传递的是自定的mapper和reducer的类,输入输出的路径必须指定,输出的类型<k3,v3>必须指定
            //将自定义的MyMapper和MyReducer组装在一起

			//参数(明文或者MD5值)
			s=args[2];
            Configuration conf=new Configuration();
            String jobName=Test.class.getSimpleName();
            //首先写job,知道需要conf和jobname在去创建即可
            Job job = Job.getInstance(conf, jobName);
            //如果要打包运行改程序,则需要调用如下行
            job.setJarByClass(Test.class);
            //读取HDFS內容:设置输入路径
            FileInputFormat.setInputPaths(job, new Path(args[0]));
            //指定解析<k1,v1>的类(谁来解析键值对)
            //*指定解析的类可以省略不写,因为设置解析类默认的就是TextInputFormat.class
            job.setInputFormatClass(TextInputFormat.class);
            //指定自定义mapper类
            job.setMapperClass(TestMapper.class);
            //指定map输出的key2的类型和value2的类型  <k2,v2>
            //下面两步可以省略,当<k3,v3>和<k2,v2>类型一致的时候,<k2,v2>类型可以不指定
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(Text.class);
            //分区(默认1个),排序,分组,规约 采用 默认
//            job.setCombinerClass(null);
            //接下来采用reduce步骤
            //指定自定义的reduce类
//            job.setReducerClass(null);
            //指定输出的<k3,v3>类型
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(Text.class);
            //指定输出<K3,V3>的类
            //下面这一步可以省
//            job.setOutputFormatClass(TextOutputFormat.class);
            //指定输出路径
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
            //写的mapreduce程序要交给resource manager运行
            job.waitForCompletion(true);
}

}

  

四、导出JAR包放到Hadoop中运行

把文件导出成JAR包,在终端使用命令

生成密文:

bin/hadoop jar [jar包路径] [输入文件路径] [输出路径]

查询

bin/hadoop jar [jar包路径] [输入文件路径] [输出路径] [密文或者明文]

生成的密文结果实例:

查询的结果示例:

ok以上,祝君好运。

原文地址:https://www.cnblogs.com/cbs-writing/p/8506102.html

时间: 2024-10-10 04:53:19

暴力破解MD5的实现(MapReduce编程)的相关文章

Python黑客编程2 入门demo--zip暴力破解

Python黑客编程2 入门demo--zip暴力破解 上一篇文章,我们在Kali Linux中搭建了基本的Python开发环境,本篇文章为了拉近Python和大家的距离,我们写一个暴力破解zip包密码的小程序.这个例子来自于<Voilent Python>一书,这也是一本python黑客编程的入门书,推荐大家看一看. 照顾没有接触过Python编程的同学,行文可能会有些啰嗦. 废话少说,我们进入正题. 2.1 准备基本材料 在/home/ziptest/目录下,我创建了两个文件,一个test

shadow文件弱口令暴力破解——John

在渗透测试中,这里主要说的是linux系统,我们经常遇到任意文件下载或读取,以及命令执行等,但是命令执行有些时候并没有交互式的,我们想添加账号和密码就会很困难,所以这时我们就可以读取shadow文件,将内容保存到本地,然后使用john来进行破解,从而可使用系统中的账号进行远程连接控制! 下载地址:http://www.openwall.com/john/ 基本使用语法: john shadow [email protected]:~# john /etc/shadow Warning: dete

Linux 利用hosts.deny 防止暴力破解ssh(转)

一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7系统).Development Tools. 主机ip:192.168.30.64 (服务器端).192.168.30.64(客户端+ 暴力破解[Hydra]) 在30.63上进行暴力破解30.64 2.2 客户端上安装 破解程序 hydra.关于该程序的详情请去官网. 安装该软件的依赖环境: [[

htpwdScan — 一个简单的HTTP暴力破解、撞库攻击脚本

李姐姐之前跟我们分享了子域名枚举工具subDomainBrute<subDomainsBrute — 改进渗透测试时暴力枚举子域名的python脚本>,这回带给我们htpwdScan htpwdScan 是一个简单的HTTP暴力破解.撞库攻击脚本: 1. 支持批量校验并导入HTTP代理,低频撞库可以成功攻击大部分网站,绕过大部分防御策略和waf2. 支持直接导入互联网上泄露的社工库,发起撞库攻击3. 支持导入超大字典4. 其他细微功能:随机X-Forwarded-For.随机SessionID

Linux 利用hosts.deny 防止暴力破解ssh

一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7系统).Development Tools. 主机ip:192.168.30.64 (服务器端).192.168.30.64(客户端+ 暴力破解[Hydra]) 在30.63上进行暴力破解30.64 2.2 客户端上安装 破解程序 hydra.关于该程序的详情请去官网. 安装该软件的依赖环境: [[

DVWA系列(三)----Brute Force(暴力(破解))

一.攻击模块1:Brute Force(暴力破解) 暴力破解一般指穷举法,穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕.若某个情况验证符合题目的全部条件,则为本问题的一个解:若全部情况验证后都不符合题目的全部条件,则本题无解.穷举法也称为枚举法.       二.源码分析(文件地址:./DVWA/vulnerabilities/brute/source/low.PHP)   [html] view plain copy <?p

网络攻防研究第001篇:尝试暴力破解某高校研究生管理系统学生密码

前言 如果你是在校大学生,而且还对网络攻防比较感兴趣的话,相信你最开始尝试渗透的莫过于所在院校的学生管理系统.因为一般来说这样的系统往往比较薄弱,拿来练手那是再合适不过的了.作为本系列的第一篇文章,我将会利用暴力破解的方式,尝试对某高校的研究生管理系统的学生密码进行破解.由于这个管理系统的网站属于该高校的内网资源,外网是无法访问的,因此大家就不要尝试按照文中的内容来对文中出现的网址进行访问了.利用本文所论述的暴力破解思想,可以帮助大家更好地认识我们的网络,也有助于了解目标网站是否安全.那么在这里

Burp Suite渗透操作指南 【暴力破解】

1.1 Intruder高效暴力破解 其实更喜欢称Intruder爆破为Fuzzing.Intruder支持多种爆破模式.分别是:单一字典爆破.多字段相同字典爆破.多字典意义对应爆破.聚合式爆破.最常用的应该是在爆破用户名和密码的时候.使用聚合方式枚举了. Payload Set的1.2.3分别对应要爆破的三个参数. 1.1.1 字典加载 Payload里面提供了一些fuzzing字典,但是总觉得不是特好用. 如果嫌弃自带的字典不太符合国情,你可以手动加载自定义字典列表. 如果爆破的结果在返回数

385cc412a70eb9c6578a82ac58fce14c 教大家破解md5验证值

Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节,是工具中的一个重要"辅助工具".md5解密主要用于网络攻击,在对网站等进行入侵过程,有可能获得管理员或者其他用户的账号和密码值(md5加密后的值).获得的密码值有两种情况,一种是明文,另外一种就是对明文进行了加密.如果密码值是加密的,这个时候就需要对密码值进行判断,如果是采取md5加密,则可以通过MD5Crack3等软件进行破解.王小云教授的md5密码碰撞破解算法没有公布,因此目前Md5解密方式主要采取暴力破解, 即软件通过