Vandaag heb ik eens nagedacht over het feit dat men bij hashen van het wachtwoord in combinatie met een, al dan niet random, salt deze voor of achter het gehashte wachtwoord plaatsen in de database. Op die manier zou in theorie de salt gevonden kunnen worden en zodoende toch het wachtwoord gevonden kunnen worden. Dit in het achterhoofd hebbende kwam ik tot het volgende idee: We gaan het wachtwoord hashen op de conventionele manier met een random salt. Vervolgens ga ik aan de hand van de numerieke ascii karakters en de som van eventuele numerieke karakters van het wachtwoord aan de slag om steeds een stukje van de salt in te voegen in het gehashte wachtwoord. In theorie zou je dan alleen de salt terug kunnen vinden aan de hand van het wachtwoord, heb je geen wachtwoord, dan is het gehashte wachtwoord dus in theorie eigenlijk onbruikbaar.
Ik heb ook al een prototype gebouwd. hash_password zal het wachtwoord hashen en mixen met de salt, compare_password gaat met het gegeven wachtwoord het proces omkeren en de salt er uitfilteren. Ik heb het getest, en de code werkt.
Mijn vraag aan jullie is: Heb ik nu iets gemaakt dat niet gaat werken of heb ik dubbel werk geleverd?
Ik heb ook al een prototype gebouwd. hash_password zal het wachtwoord hashen en mixen met de salt, compare_password gaat met het gegeven wachtwoord het proces omkeren en de salt er uitfilteren. Ik heb het getest, en de code werkt.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
| <?php function hash_password($password, $hash = null) { $salt = (is_null($hash)) ? sha1(md5(time().rand(0, 9999) + strlen($password))) : $hash; for ($i = 0; $i < 10000; $i++) $saltedPassword = sha1($password . $salt); $sumord = strlen($password); $sumnr = 1; while (true) { if (strlen($salt) <= 0) break; for ($i = 0; $i < strlen($password); $i++) { if (strlen($salt) <= 0) break; $ord = ord($password[$i]); $sumord += $ord; if (ctype_digit($password[$i])) $sumnr += $password[$i]; $key = $sumnr * $sumord; $position = $key % 40; $group = ($sumord % 2) ? 3 : 2; if (strlen($salt) < $group) $group = strlen($salt); if ($key % 2) { $saltedPassword = substr($saltedPassword, 0, $position) . substr($salt, 0, $group) . substr($saltedPassword, $position); $salt = substr($salt, $group, strlen($salt)); } else { $saltedPassword1 = substr($saltedPassword, 0, strlen($saltedPassword) - $position); $saltedPassword = $saltedPassword1 . substr($salt, strlen($salt) - $group, strlen($salt)) . substr($saltedPassword, strlen($saltedPassword1)); $salt = substr($salt, 0, strlen($salt) - $group); } } } return $saltedPassword; } function compare_password($password, $saltedPassword) { $sumord = strlen($password); $sumnr = 1; $decoders = array(); $salt = sha1("dummyhash"); while (true) { if (strlen($salt) <= 0) break; for ($i = 0; $i < strlen($password); $i++) { if (strlen($salt) <= 0) break; $ord = ord($password[$i]); $sumord += $ord; if (ctype_digit($password[$i])) $sumnr += $password[$i]; $key = $sumnr * $sumord; $position = $key % 40; $group = ($sumord % 2) ? 3 : 2; if (strlen($salt) < $group) $group = strlen($salt); $decoders[] = array("ord" => $ord, "sumord" => $sumord, "sumnr" => $sumnr, "group" => $group, "key" => $key); $salt = substr($salt, $group, strlen($salt)); } } $decoders = array_reverse($decoders); $salt = ""; $unsaltedPassword = $saltedPassword; foreach ($decoders as $decoder) { if (strlen($salt) >= 40) break; $position = $decoder['key'] % 40; if ($decoder['key'] % 2) { $salt = substr($unsaltedPassword, $position, $decoder['group']) . $salt; $unsaltedPassword = substr($unsaltedPassword, 0, $position) . substr($unsaltedPassword, $position + $decoder['group']); } else { $salt .= substr($unsaltedPassword, strlen($unsaltedPassword) - ($position + $decoder['group']), $decoder['group']); $unsaltedPassword = substr($unsaltedPassword, 0, strlen($unsaltedPassword) - ($position + $decoder['group'])) . substr($unsaltedPassword, (strlen($unsaltedPassword) - $position)); } } return $saltedPassword == hash_password($password, $salt); } ?> |
Mijn vraag aan jullie is: Heb ik nu iets gemaakt dat niet gaat werken of heb ik dubbel werk geleverd?