Для начала не файл, а база.
Делаете таблицу 'rainbow_table'
CREATE TABLE `rainbow_table` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`pass` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',
`hash` CHAR(32) NOT NULL COLLATE 'utf8mb4_unicode_ci',
PRIMARY KEY (`id`) USING BTREE,
INDEX `hash_index` (`hash`) USING BTREE
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB;
Заполняете ее готовыми паролями и их хешами. На столбик hash повесьте индекс.
И потом вам останется только сделать выборку из базы
$config = [
'db_name' => 'md5hashes',
'db_host' => '127.0.0.1',
'db_user' => 'mysql',
'db_pass' => 'mysql',
];
$hash = $_POST['hash'];
$dsn = 'mysql:dbname='.$config['db_name'].';host='.$config['db_host'];
$pdo = new PDO($dsn, $config['db_user'], $config['db_pass']);
$stmt = $pdo->prepare('SELECT * FROM `rainbow_table` WHERE `hash` = :hash')
$stmt->execute(['hash' => $hash]);
if ($stmt->rowCount() > 0) {
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo 'Хэш найден: '.$row['pass'];
} else {
echo 'Хэш не найден';
}
Для того, чтобы заполнить таблицу создайте файл words.txt, в котором на каждой строке будет один пароль
$dsn = 'mysql:dbname='.$config['db_name'].';host='.$config['db_host'];
$pdo = new PDO($dsn, $config['db_user'], $config['db_pass']);
$stmt = $pdo->prepare('INSERT INTO `rainbow_table` (`pass`, `hash`) VALUES (:pass, :hash)');
$fp = fopen('words.txt', 'r');
if ($fp) {
while (($buffer = fgets($fp)) !== false) {
$stmt->execute(['pass' => $buffer, 'hash' => md5($buffer)]);
}
if (!feof($fp)) {
echo "Ошибка: fgets() неожиданно потерпел неудачу\n";
}
fclose($fp);
}