自建MD5解密平台-续

使用 PHP 构建 MD5 彩虹表生成器的完整过程

在信息安全领域,**彩虹表(Rainbow Table)**是一种通过预计算哈希值和对应原始值的方式来破解密码的工具。为了实现一个简单高效的 MD5 彩虹表生成器,我使用了 PHP 和 MySQL,本文将详细介绍整个实现过程,并深入探讨如何解决开发中遇到的问题。

项目背景和需求

在项目的初始阶段,我们需要一个自动化生成 MD5 彩虹表的工具,并将生成的数据存储在 MySQL 数据库中。主要功能包括:

  1. 批量生成 MD5 哈希和对应的原始字符串
  2. 去重处理,避免重复存储相同的 MD5 哈希
  3. 可扩展性,支持任意字符集和字符串长度。
  4. 高效插入数据,避免性能瓶颈。

然而,在实现的过程中遇到了两个关键问题:

  1. 每次刷新页面时,因没有去重导致重复数据大量生成。
  2. 设置批量生成的目标条数(如 10,000 条),但数据量却无法稳定在目标值。

接下来,我们将详细拆解整个解决方案和代码实现。

数据库设计

在生成彩虹表之前,我们需要设计存储数据的数据库表。

数据表结构

表名为 rainbow_table,包含以下字段:

  • id: 自增主键,用于标识每条记录。
  • hash: 存储 MD5 哈希值。
  • original: 存储原始字符串。
  • unique_hash: 创建唯一约束,确保哈希值不重复。

SQL 表的创建代码如下:

sql 复制代码
CREATE TABLE rainbow_table (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    hash VARCHAR(32) NOT NULL,
    original VARCHAR(255) NOT NULL,
    UNIQUE KEY unique_hash (hash)
);

如果表不存在,我们会在 PHP 脚本中动态创建它,确保代码的鲁棒性。

PHP 脚本实现

核心逻辑概述

  1. 字符集配置:可以自由定义生成字符串所使用的字符集,包括大小写字母、数字和特殊符号。
  2. 随机生成字符串:通过随机组合字符,生成指定长度的字符串。
  3. MD5 哈希计算:将随机字符串计算为 MD5 哈希值。
  4. 数据插入与去重 :使用 INSERT IGNORE 避免重复插入。
  5. 批量生成与页面自动刷新:每次生成一定数量的数据后自动刷新页面,持续生成。

完整 PHP 代码如下:

php 复制代码
<?php
$servername = "localhost";
$username = "md5";
$password = "123456";
$dbname = "md5";
$tableName = "rainbow_table";

// 创建数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接是否成功
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 检查表是否存在,如果不存在则创建
$tableExists = $conn->query("SHOW TABLES LIKE '$tableName'")->num_rows > 0;
if (!$tableExists) {
    $createTableSql = "CREATE TABLE $tableName (
        id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        hash VARCHAR(32) NOT NULL,
        original VARCHAR(255) NOT NULL,
        UNIQUE KEY unique_hash (hash)
    )";
    if ($conn->query($createTableSql) === TRUE) {
        echo "表 $tableName 创建成功<br>";
    } else {
        die("创建表错误: " . $conn->error);
    }
}

// 彩虹表生成函数
function generateRainbowTable($charset, $batchSize, $conn, $tableName) {
    $charsetLength = strlen($charset);
    $count = 0;
    $maxLength = 18; // 设置随机字符串最大长度

    while ($count < $batchSize) {
        // 随机生成字符串长度
        $length = rand(1, $maxLength);
        $count += generateRandomCombination($charset, $length, $charsetLength, $conn, $batchSize - $count, $tableName);
    }

    echo "生成了 $count 条记录\n";
}

function generateRandomCombination($charset, $length, $charsetLength, $conn, $remaining, $tableName) {
    if ($remaining <= 0) return 0;

    $currentString = '';
    for ($i = 0; $i < $length; $i++) {
        $currentString .= $charset[rand(0, $charsetLength - 1)];
    }

    $hash = md5($currentString);

    // 使用 INSERT IGNORE 避免重复插入
    $stmt = $conn->prepare("INSERT IGNORE INTO $tableName (hash, original) VALUES (?, ?)");
    $stmt->bind_param("ss", $hash, $currentString);
    $stmt->execute();

    return $stmt->affected_rows > 0 ? 1 : 0;
}

// 配置
$charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.@#*?!$%^&()-_=+[]{}|;:,.<>~'; // 定义字符集
$batchSize = 2000; // 每次生成 2000 条

generateRainbowTable($charset, $batchSize, $conn, $tableName);

$conn->close();
?>

关键点解析

  1. 随机生成字符串

    php 复制代码
    $length = rand(1, $maxLength);
    $currentString .= $charset[rand(0, $charsetLength - 1)];

    使用 rand() 随机生成字符串长度,再通过字符集随机组合字符,生成目标字符串。

  2. 避免重复插入

    php 复制代码
    $stmt = $conn->prepare("INSERT IGNORE INTO $tableName (hash, original) VALUES (?, ?)");

    使用 INSERT IGNORE 确保插入数据时,遇到重复哈希值会自动跳过,避免浪费资源。

  3. 批量生成与计数

    php 复制代码
    $count += generateRandomCombination($charset, $length, $charsetLength, $conn, $batchSize - $count, $tableName);

    每次生成一定数量的数据,直到达到目标批量数量。

前端自动刷新页面

为了实现自动化生成,我们在前端页面使用 JavaScript 设置定时刷新,每次刷新生成一批数据:

html 复制代码
<script>
    // 页面加载完成后自动刷新
    window.onload = function() {
        setTimeout(function() {
            location.reload();
        }, 1000); // 1秒后刷新页面
    };
</script>

通过这种方式,可以在页面刷新时持续调用生成函数,直到数据库存储满足预期需求。

问题与优化方案

问题 1:重复数据导致效率低下

最初代码未去重,每次刷新生成的大量数据包含重复项,浪费了存储和计算资源。通过添加 INSERT IGNORE 和数据库唯一索引,解决了此问题。

问题 2:生成数据量不足

由于生成逻辑中可能因重复数据导致插入失败,数据总量无法达到目标条数。通过调整随机生成逻辑,确保生成字符串更加分散,提高了数据覆盖率。

结论

本文通过详细介绍一个 PHP 实现的 MD5 彩虹表生成器,展示了从数据库设计到代码优化的完整流程。通过随机生成字符串、去重插入以及前端自动刷新机制,实现了高效的批量生成工具。

该工具不仅适用于 MD5,还可拓展为其他哈希算法生成器(如 SHA-1 或 SHA-256)。未来可进一步优化数据生成算法,提高生成速度和覆盖范围。

最后我的MD5解密平台:md5.li

相关推荐
Mr YiRan4 小时前
网络请求API监控与网络切换埋点
android·网络
美狐美颜sdk8 小时前
直播APP开发技术栈详解:视频美颜SDK、人脸识别与实时渲染
android·人工智能·音视频·美颜sdk·直播美颜sdk
奈斯先生Vector13 小时前
当模型版本不断变化,RelayRouter 能否帮助 AI 应用摆脱深度绑定
android·java·人工智能·开源·aigc
TimeFine13 小时前
让强模型做“总工”,让高性价比模型写代码
android
又见情义15 小时前
RK3568 Android 13 屏蔽 healthd 电池日志经验分享
android
古法安卓18 小时前
Android-Fork 机制详解
android·java·android studio
Android打工仔18 小时前
不要在 Data 层随意把 Cold Flow 转换成 Hot Flow
android·架构·kotlin
峥嵘life19 小时前
2026免费的 opencode 使用分享:Windows端 + 服务器CLI 实战总结
android·大数据·开发语言
杉氧19 小时前
拒绝重复造轮子:我写了一个生产级的 Kotlin 协程与 Flow 工具库(CoroutineKit)
android·kotlin·workflow
恋猫de小郭20 小时前
Flutter GSoC 2026 提案进度解读,补上 DevTools、FFI 和原生平台的关键缺口
android·前端·flutter