Ich lade die SHA1-Passwortsammlung von Troy doch endlich mal in eine lokale Test-DB… ![]()
![]()
Das könnte bei 551 Millionen Zeilen etwas dauern. Mal schauen, welche Performance mir MariaDB nachher bringt. Den Index lege ich erst nach dem Import drauf. Zur Sicherheit alles unter einer zusätzlichen MariaDB-Instanz – Dank Systemd in wenigen Sekunden erstellt. Die kann ich leichter optimieren und schneller wieder verwerfen.
Spoiler anzeigen
Das Importscript ist mehr oder weniger Quick & Dirty:
#!/usr/bin/env php
<?php
function exception_error_handler($severity, $message, $file, $line)
{
if (!(error_reporting() & $severity))
{
return;
}
throw new ErrorException($message, 0, $severity, $file, $line);
}
error_reporting(-1);
set_error_handler('exception_error_handler');
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', '<username>', '<password>', '<db>', 12345);
$stmt = $db->prepare('INSERT INTO `passwords` SET `hash` = UNHEX(?)');
$hash = null; $stmt->bind_param('s', $hash);
$filename = __dir__ . '/pwned-passwords-sha1-ordered-by-hash-v4.txt';
$file = fopen($filename, 'r');
$size = filesize($filename);
$i = $l = 0;
while(($line = fgets($file, 64)) !== false)
{
$l += strlen($line);
if(($p = strpos($line, ':')) !== false)
{
$hash = substr($line, 0, $p);
$stmt->execute();
}
if(!(++$i % 1000))
{
printf("\r% 10d lines (%.3f/%.3f GB)", $i, $l / 1024 / 1024 / 1024, $size / 1024 / 1024 / 1024);
}
}
fclose($file);
$stmt->close();
$db->close();
?>
Alles anzeigen
Die Tabelle ist ebenfalls ziemlich einfach gehalten, noch ohne Index:
CREATE TABLE `passwords` ( `hash` BINARY(20) NOT NULL ) ENGINE = InnoDB CHARSET=ascii COLLATE ascii_bin COMMENT = 'v4';
Über den Index muss ich mir erst Gedanken machen. Wird wahrscheinlich drauf raus laufen, dass ich den nur auf die ersten <n> Byte lege. Mit so großen Tabellen habe ich keine Erfahrung. Eventuell komprimiere ich die InnoDB-Tabelle nachher, das muss ich erst testen.
Dass MariaDB dafür nicht die beste Wahl ist, ist mir durchaus bewusst. Aber ich will mich dafür a) nicht extra in eine neue Software einarbeiten und b) die Möglichkeiten von MariaDB ein wenig austesten.