Java关于暴力破解MD5加密字符串示例

最近看到一个系统的用户密码直接就是用MD5加密的方式存在数据库的,而且也没有加盐,顿时有些好奇,因为一直听说MD5加密不够安全,很容易碰撞攻击,但是这个容易是有多容易,如果要破解一个MD5加密的密码大概要多久?

这人一好奇就停不下来,直接上手撸代码

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;/*** @author Sakura* @date 2024/11/8 13:01*/
public class MD5CollisionFinder {// 列出密码组成可能出现的字符private static final char[] CHARSET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._/-@".toCharArray();// 控制密码碰撞尝试的最大长度,长度越大需要的时间就越久,当然你的机器计算能力越强时间就越短private static final int MAX_LENGTH = 11;// 这里因为我把密码放在数据表格里所以需要配置数据库   private static final String URL = "jdbc:mysql://192.168.31.118:3306/ceshi?useUnicode=true&characterEncoding=utf-8&useSSL=false";private static final String USER = "admin";private static final String PASSWORD = "px123456";public static void main(String[] args) throws InterruptedException, ExecutionException {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");long startTime = System.currentTimeMillis();Date startDate = new Date(startTime);System.out.println("开始时间: " + dateFormat.format(startDate));// 原始JDBC连接数据库List<String> passwords = new ArrayList<>();try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD)) {System.out.println("数据库连接成功!");String sql = "SELECT pass_word FROM user";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {try (ResultSet resultSet = preparedStatement.executeQuery()) {while (resultSet.next()) {String passWord = resultSet.getString("pass_word");passwords.add(passWord);}}}} catch (SQLException e) {System.out.println("数据库操作异常: " + e.getMessage());}// 这里我们分开多个线程加快速度,我这里是根据密码最大长度MAX_LENGTH来控制线程的// 比如1号线程处理1个字符长度的 2号线程处理2个线程长度一次类推Map<String, String> foundMatches = new ConcurrentHashMap<>();ExecutorService executor = Executors.newFixedThreadPool(MAX_LENGTH);List<Future<?>> futures = new ArrayList<>();// 为每种长度的字符串创建一个独立的线程任务for (int length = 1; length <= MAX_LENGTH; length++) {final int currentLength = length;futures.add(executor.submit(() -> findCollisions("", passwords, foundMatches, currentLength)));}// 等待所有任务完成for (Future<?> future : futures) {future.get();}executor.shutdown();System.out.println("找到的碰撞字符串:");for (Map.Entry<String, String> entry : foundMatches.entrySet()) {System.out.println("MD5: " + entry.getKey() + " 对应的原始字符串: " + entry.getValue());}long endTime = System.currentTimeMillis();Date endDate = new Date(endTime);System.out.println("结束时间: " + dateFormat.format(endDate));}public static void findCollisions(String current, List<String> targetHashes, Map<String, String> foundMatches, int targetLength) {if (current.length() == targetLength) {String currentHash = md5Encrypt(current);if (targetHashes.contains(currentHash) && !foundMatches.containsKey(currentHash)) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");long dataTime = System.currentTimeMillis();Date date = new Date(dataTime);System.out.println(dateFormat.format(date) + "找到碰撞字符串:" + current + ",MD5:" + currentHash);foundMatches.put(currentHash, current);}return;}for (char c : CHARSET) {findCollisions(current + c, targetHashes, foundMatches, targetLength);}}public static String md5Encrypt(String input) {try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] messageDigest = md.digest(input.getBytes());StringBuilder hexString = new StringBuilder();for (byte b : messageDigest) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) hexString.append('0');hexString.append(hex);}return hexString.toString();} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}}
}

大家可以看到为了加快速度我这里是开了多个线程的,但是目前我的电脑配置理论上是带不动这么多线程,所以如果有人测试过上面这个代码可以告诉我一下你们的配置和破解一个多少位密码所需要的时间

为了方便测试我随便造了几条数据

在这里插入图片描述

程序运行后要等一会,比如我这个大概十分钟左右就已经可以破解出5位长度的密码

在这里插入图片描述

如果字符集大小为 64(如 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._/-@)
5 位密码的组合数为 6 4 5 64^{5} 645=1,073,741,824(约 10 亿种可能)
6 位密码的组合数为 6 4 6 64^{6} 646=68,719,476,736(约 687 亿种可能)

最后告诫大家,如果真的想保证数据安全,尽量不要用MD5加密密码,就算用MD5至少加个盐,当然我曾经还见过一个系统它真的加盐了,但是所有的密码都是用的同一个盐,这就属于掩耳盗铃的典范了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/468303.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我国成功发射航天宏图PIESAT-2 01~04星

11月9日11时39分&#xff0c;我国在酒泉卫星发射中心使用长征二号丙运载火箭&#xff0c;成功将航天宏图PIESAT-2 01&#xff5e;04星发射升空&#xff0c;卫星顺利进入预定轨道&#xff0c;发射任务获得圆满成功[1]。 航天宏图信息技术股份有限公司&#xff08;以下简称“航天…

三十四、VB基本知识与提高篇

一、代码编写规则: (一)标识符的使用规则: 标识符有两种:一种是系统关键字,另一种是自己定义标识符。 1、不能与系统关键字相同。 2、同一作用域(块)中不同出现重名标识符。用户自定义的标识符是不区分大小写的。 3、自定义标识符必须以字母开头,长度不能超过255…

[代码随想录打卡Day8] 344.反转字符串 541. 反转字符串II 54. 替换数字

反转字符串 难度&#xff1a;易。 问题描述&#xff1a;编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 这个就是开头…

【双十一特惠】腾讯云省钱攻略:如何智取云计算资源

前言 双十一不仅是购物的狂欢节&#xff0c;对于云计算用户来说&#xff0c;更是一个节省成本的绝佳时机。腾讯云&#xff0c;作为国内领先的云计算服务商&#xff0c;每年双十一都会推出一系列优惠活动。本文将为您揭开如何在这个购物节中&#xff0c;最大化利用腾讯云的优惠…

mean_x2 = (x**2).mean(dim=dims, keepdims=True)

这行代码的作用是计算输入张量 x 在指定维度上的平方均值&#xff0c;并保持原始维度的形状。具体来说&#xff1a; mean_x2 (x**2).mean(dimdims, keepdimsTrue) # [b,1,1] 参数解释 x**2&#xff1a;对输入张量 x 的每个元素进行平方运算。.mean(dimdims, keepdimsTrue)…

如何在 Android 上增加 SELinux 权限

SELinux&#xff08;Security-Enhanced Linux&#xff09;是一种强制访问控制&#xff08;MAC&#xff09;机制&#xff0c;它为 Android 系统提供了额外的安全层。通过 SELinux&#xff0c;系统管理员可以定义细粒度的安全策略&#xff0c;限制进程对文件、网络和其他资源的访…

数字化转型实践:金蝶云星空与钉钉集成提升企业运营效率

数字化转型实践&#xff1a;金蝶云星空与钉钉集成提升企业运营效率 本文介绍了深圳一家电子设备制造企业在数字化转型过程中&#xff0c;如何通过金蝶云星空与钉钉的高效集成应对挑战、实施解决方案&#xff0c;并取得显著成果。集成项目在提高沟通效率、自动化审批流程和监控异…

『事善能』MySQL基础 — 2.MySQL 5.7安装(一)

1、通过msi安装软件进行MySQL安装 &#xff08;1&#xff09;点击运行MySQL安装文件 &#xff08;2&#xff09;选择安装类型 我们选择自定义安装&#xff0c;点击Next。 说明 Develop Default&#xff1a;默认开发类型&#xff0c;安装MySQL服务器以及开发MySQL应用所需要的工…

DICOM图像知识:DICOM图像排序与坐标系解析

目录 引言 1. 概述 2. DICOM图像排序规则 2.1 Patient的Study按Study Date排序 2.2 Study的Series按Series Number排序 2.3 Series的SOP按Instance Number或Slice Location排序 2.3.1 Instance Number排序 2.3.2 Slice Location排序 2.3.3 使用Image Position (Patien…

uniapp—android原生插件开发(2原生插件开发)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; ***环境问题移步至&#xff1a;uniapp—an…

清华大学提出Mini-Omni2:开源多模态模型,功能与GPT-4o媲美!

&#x1f310; 在人工智能领域&#xff0c;多模态模型的发展正如火如荼。今天&#xff0c;我们要介绍的是由清华大学提出的Mini-Omni2&#xff0c;这是一个开源的多模态语言模型&#xff0c;它在功能上与GPT-4o相媲美&#xff0c;能够理解和生成视觉、听觉和文本内容&#xff0…

Golang进阶

1.面向对象 1.1.golang语言面向对象编程说明 Golang 也支持面向对象编程(OOP)&#xff0c;但是和传统的面向对象编程有区别&#xff0c;并不是纯粹的面向对象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。Golang 没有类(class)&#xff0c;Go 语言的结构体(st…

ElasticSearch 添加IK分词器

ElasticSearch 添加IK分词器 前言一、IK分词器的算法二、Ik分词器的下载安装&#xff08;Winows 版本&#xff09;三、Ik分词器的下载安装&#xff08;Linux 版本&#xff09;四、验证测试&#xff08;postman工具&#xff09;测试 ik_smart 分词算法测试 ik_max_word 分词算法…

双指针算法的妙用:提高代码效率的秘密(2)

双指针算法的妙用&#xff1a;提高代码效率的秘密&#xff08;2&#xff09; 前言&#xff1a; 小编在前几日讲述了有关双指针算法两道题目的讲解&#xff0c;今天小编继续进行有关双指针算法习题的讲解&#xff0c;老规矩&#xff0c;今天还是两道题目的讲解&#xff0c;希望…

浮动路由:实现出口线路的负载均衡冗余备份。

浮动路由 Tip&#xff1a;浮动路由指在多条默认路由基础上加入优先级参数&#xff0c;实现出口线路冗余备份。 ip routing-table //查看路由表命令 路由优先级参数&#xff1a;越小越优 本次实验测试两条默认路由&#xff0c;其中一条默认路由添加优先级参数&#xff0c;设置…

利用VMware workstation pro 17安装 Centos7虚拟机以及修改网卡名称

通过百度网盘分享的文件&#xff1a;安装虚拟机必备软件 链接&#xff1a;https://pan.baidu.com/s/1rbYhDh8x1hTzlSNihm49EA?pwdomxy 提取码&#xff1a;omxy 123网盘 https://www.123865.com/s/eXPrVv-UsKch 提取码:eNcy 先自行安装好VMware workstation pro 17 设置虚拟机…

如何在Linux中使用Cron定时执行SQL任务

文章目录 前言一、方案分析二、使用步骤1.准备脚本2.crontab脚本执行 踩坑 前言 演示数据需要每天更新监控数据&#xff0c;不想手动执行&#xff0c;想到以下解决方案 navicat 创建定时任务java服务定时执行linux crontab 定时执行sql脚本 一、方案分析 我选择了第三个方案…

SpringBoot技术在企业资产管理中的应用

4系统概要设计 4.1概述 系统设计原则 以技术先进、系统实用、结构合理、产品主流、低成本、低维护量作为基本建设原则&#xff0c;规划系统的整体构架. 先进性&#xff1a; 在产品设计上&#xff0c;整个系统软硬件设备的设计符合高新技术的潮流&#xff0c;媒体数字化、压缩、…

linux基础-完结(详讲补充)

linux基础-完结 一、Linux目录介绍 二、基础命令详细讲解 1. ls&#xff08;列出目录内容&#xff09; 2. cd&#xff08;更改目录&#xff09; 3. clear&#xff08;清除终端屏幕&#xff09; 4. pwd(显示你当前所在的目录) 5. vim(文本编辑器) 6. touch&#xff08;创…

ArcGIS软件之“计算面积几何”地图制作

目录 一、消防站的泰森多边形ex12二、人口调查的泰森多边形三、人口调查的泰森多边形属性设置四、计算面积几何,用于求密度五、求密度六、给“现有中学”属性 R1赋值七、“现有中学”设置多环缓存区 并为它赋值八、“土地使用”为不同的功能区赋值九、三个图层相交十、计算面积…