bei MD5-Hashing
MD5-Hashing sollte auf jeden Fall abgelöst werden. Das ist weit aus der Zeit.
Wenngleich Rolf recht damit hat, dass eine vollständige Rainbow-Table für MD5 nicht speicherbar sei, so wird Sie es dennoch bald sein.
Übrigens:
Die Schwäche von MD5 liegt darin, dass ein Hash relativ fix berechnet ist und dass es Kollisionsangriffe gibt (d.h. zwei Nachrichten mit gleichem Anfang liefern den gleichen Hash). Damit ist MD5 zum Signieren ungeeignet.
Ist so nicht zu halten. Die beiden (aus einem centos-Image hergestellten) Dateien
$ ls -lh /tmp/centos?
-rw------- 1 fastix fastix 4,2G Aug 28 16:55 /tmp/centos1
-rw------- 1 fastix fastix 4,2G Aug 28 16:55 /tmp/centos2
unterscheiden sich durch nur das letzte Byte ("1", "2")
$ md5sum < /tmp/centos1
43deec111a143a8a3fdfbf38c7804e15 -
$ md5sum < /tmp/centos2
45a97b054de3f5e8295d41170df51b09 -
Wenn bei MD5 zwei Nachrichten "mit gleichem Anfang" den gleichen Hash liefern würden sähe das anders aus. MD5 für Signatur bzw. Verifizierungszwecke zwecke ist aber dennoch inzwischen angreifbar.
dafür ist ja SHA-2 gemacht. Die Hauptaufgabe ist es dort aber - meine ich - das Hashen vorsätzlich langsam zu machen, so dass man eben nicht per Hardware Millionen oder Milliarden Hashes pro Sekunde berechnen kann.
Richtig ist, dass man irgendwann entdeckt, dass der SHA-1-Algo von der mitnormenden NSA geschwindigkeitsoptimiert wurde… Neben SHA2 und dessen Kindern (derzeit bis SHA512 gängig) soll die oben beschriebene Rundendreherei das Verfahren verlangsamen. Das geht in PHP mit password_hash() immerhin bis 2^30.
Standard (2^10 Runden):
<?php
$options = [];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
Test:
$ time php /tmp/test_standard.php
$2y$10$l5P.mHtjft91dz52vHmNqua7IiaquE06mrJoyv8C7MnapkneMmL9O
real 0m0,081s
user 0m0,073s
sys 0m0,008s
2^15 Runden:
<?php
# file: /tmp/test_15.php
$options = [
'cost' => 15,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
Test:
$ time php /tmp/test_15.php
$2y$15$zeOQVgaUtgZbyRC4A0tZRODSX7sXIozyGRo1oekEd7ejGmBTl75i6
real 0m1,912s
user 0m1,908s
sys 0m0,004s
(Maximum) 2^30 Runden:
<?php
#file: /tmp/test_30.php
$options = [
'cost' => 30,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
Test:
$ time php /tmp/test_30.php
# Nach über 1h noch kein Ergebnis.
# Ich lasse das gerade gegen das Update eines seit Februar
# nicht benutzten Windows antreten.
# Der Erfahrung nach dauert beides Stunden...
### Ups. Windows ist fertig!