A
Ap0ll0XT
Guest
Ich habe da mal eine Frage. Ich habe für mein RIA-Framework eine Funktion zum hashen eines Passwortes inklusive Salt geschrieben. Mein Ziel war es, Bruteforce, Rainbowtable und Kollissionsangriffe so gut wie möglich zu erschweren. Nun würde ich mich freuen, wenn da ein paar mehr drüber schauen können, ob es damit Probleme gibt oder ob man den Code so nehmen kann. Viele Augen sehen mehr als nur 4 (ich trage Brille
).
Zum Code:
Eine Demo zum testen: DEMO: Rubiks Salted SHA512 Hash
Screenshot von der Demo (wer nicht auf den Link klicken will - Demo mit PHP Desktop):
Ist das so brauchbar oder eher nicht. Wenn nicht, warum?
).Zum Code:
PHP:
function rubiksSaltedHash($password,$regstamp) {
$hashed_stamp = substr(preg_replace("![^0-9]!","",hash("sha256",$regstamp)),0,12);
$hashes = array("md5","sha1","sha256","sha384","ripemd128","ripemd160","ripemd256","ripemd320","snefru","gost");
$salt_len = (int) $hashed_stamp[11] > 0 ? (int) $hashed_stamp[11] : 9;
$pw_prehash = $hashes[(int) $hashed_stamp[10]];
$signarray[0] = array("a","c","e","g","h","j","l","n","p","r");
$signarray[1] = array("b","d","f","i","k","m","o","q","s","t");
$signarray[2] = array("1","3","5","7","9","#","*","-",".",",");
$signarray[3] = array("2","3","6","8","0",":","_","=","/","!");
$conv_timestamp = str_split(substr((string) $hashed_stamp,0,$salt_len));
$salt = "";
foreach($conv_timestamp as $num) {
$salt .= $signarray[0][(int) $num];
$salt .= $signarray[1][(int) $num];
$salt .= $signarray[2][(int) $num];
$salt .= $signarray[3][(int) $num];
$signarray[0] = array_reverse($signarray[0]);
$signarray[1] = array_reverse($signarray[1]);
$signarray[2] = array_reverse($signarray[2]);
$signarray[3] = array_reverse($signarray[3]);
$signarray = array_reverse($signarray);
}
$spl_salt = str_split($salt);
$pass = array_reverse(str_split(hash($hashes[(int) $hashed_stamp[10]],$password)));
$new_password = "";
if(count($pass) > count($spl_salt)) {
foreach($pass as $num => $char) {
$new_password .= $char;
if(isset($spl_salt[$num])) {
$new_password .= $spl_salt[$num];
}
}
} else {
foreach($spl_salt as $num => $char) {
$new_password .= $char;
if(isset($pass[$num])) {
$new_password .= $pass[$num];
}
}
}
return hash("sha512",$new_password);
}
Screenshot von der Demo (wer nicht auf den Link klicken will - Demo mit PHP Desktop):
Ist das so brauchbar oder eher nicht. Wenn nicht, warum?