Wer Kennwörter auf verschiedenen Internetseiten wiederverwendet ist selber schuld,
Mag sein. Aber haben wir nicht eine gewisse Mitverantwortung? Man kann auch sagen, wer bei Überqueren der Straße nicht aufpasst sei selber schuld. Deiner Theorie folgend müsste man Geschwindigkeitsbeschränkungen vollständig aufheben. Auch die zwei Tasten an der Presse - weg damit! Es weiß doch ein jeder, dass man den Pressvorgang nicht auslöst wenn man eine Hand drunter hat.
Tatsächlich ist jeder, der eine Anlage erreichtet und/oder betreibt, dazu verpflichtet diese so gefahrlos wie nur möglich zu erreichten oder zu betreiben - weil eben bekannt ist, dass die Menschen oft fahrlässig handeln. Ich ersuche Dich also, Deinen Algorithmus zu verbessern.
Das was heise vorschlug, läuft übrigens auf etwas wie das hier heraus:
Die Konstante PASSWD_ITERATIONS sollte noch angepasst werden, sinnvoll sind Werte ab 5000. Mit 1 Mio Iterationen braucht das Skript bei mir je 1 Sekunde zum Ermitteln des Vielfach-Hashes und zum Prüfen des Passwortes. Je nach Server und Last kann 1 Mio zu viel sein. Aber je höher, so sicherer.
<?php
## Speicherbedarf des mehrfach gehaschten Passwortes mit Salt: 42 Byte + PASSWD_SALT_LENGHT
## (aus Zeile 10)
if (! defined('PASSWD_ITERATIONS')) {
define('PASSWD_ITERATIONS', 1000000);
}
if (! defined('PASSWD_SALT_LENGHT')) {
define('PASSWD_SALT_LENGHT', 32);
}
#### TEST #####
#/* Zum Testen am anfang dieser Zeile Raute (#) vor SlashAsterix(/*) setzen -> #/*
$test = craeteSaltedHash('Hallo');
print "gehaschtes Passwort: $test\n";
if (checkSaltedHash('Hallo' , $test) ) {
echo "Passt!\n";
} else {
echo "Nö!!\n";
}
#*/
#### /TEST #####
function craeteSaltedHash($passwd) {
if ('' == $passwd) { # oder bessere Prüfung!
return false;
}
$salt='';
for ($i=0; $i<PASSWD_SALT_LENGHT; $i++) {
$salt .= chr( rand( 33, 125 ) ); # ascii von '!' bis '}' - OHNE '~'!
}
for($i=0; $i<PASSWD_ITERATIONS; $i++) {
$passwd=sha1($salt.$passwd);
}
return ($salt.'~'.$passwd);
}
function checkSaltedHash($passwd, $saved_string) {
list($salt,$rest)=explode('~', $saved_string, 2);
# print "salt: '$salt'\n"; #### DEBUG
# print "rest: '$rest'\n"; #### DEBUG
for($i=0; $i<PASSWD_ITERATIONS; $i++) {
$passwd=sha1($salt.$passwd);
}
if ( "$passwd" == "$rest" ) {
return true;
} else {
return false;
}
}
?>