Et si j'avais un moyen de mélanger le sel avec le mot de passe d'une manière qui fasse du mot de passe la clé pour trouver le sel avant qu'un attaquant puisse commencer à faire quelque chose avec le mot de passe haché ?
Dans la fonction hash_password, le mot de passe sera haché de manière conventionnelle, puis le sel sera mélangé à la chaîne de mots de passe salée en fonction des valeurs numériques des caractères et de la somme de tous les caractères numériques. Bien sûr, le sel est généré de manière aléatoire.
La fonction compare_password utilisera le mot de passe pour inverser ce processus, ce qui donnera le sel utilisé pour hacher le mot de passe en premier lieu. Avec le sel trouvé, le mot de passe peut être comparé avec le mot de passe salé.
cette idée devrait rendre très difficile la recherche du sel pour générer la rainbow table. en gros : si vous avez le mot de passe, vous pouvez déverrouiller et entrer, si vous n'avez pas le mot de passe, la chaîne de mots de passe hachée est complètement inutile puisque vous ne connaissez pas le sel (qui est aussi aléatoire).
Bien sûr, si quelqu'un avait accès à votre base de données ET à votre code source, ce processus serait inutile, mais pourrait ajouter un poids supplémentaire.
J'espère apprendre ce que vous pensez !
function hash_password($password, $salt = null) {
if (is_null($salt)) {
$hash = "";
$count = mt_rand(1, 100);
for ($i = 0; $i < $count; $i++) {
$hash .= substr(crypt(mt_rand(1, 9999999999)), 0, mt_rand(0, 13));
}
$salt = crypt($hash, '$2a$10$' . $hash . '$');
}
$saltedPassword = crypt($password, '$2a$10$' . $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 % 60;
$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 = 60;
while (true) {
if ($salt <= 0)
break;
for ($i = 0; $i < strlen($password); $i++) {
if ($salt <= 0)
break;
$ord = ord($password[$i]);
$sumord += $ord;
if (ctype_digit($password[$i]))
$sumnr += $password[$i];
$key = $sumnr * $sumord;
$position = $key % 60;
$group = ($sumord % 2) ? 3 : 2;
if ($salt < $group)
$group = strlen($salt);
$decoders[] = array("ord" => $ord, "sumord" => $sumord, "sumnr" => $sumnr, "group" => $group, "key" => $key);
$salt = $salt - $group;
}
}
$decoders = array_reverse($decoders);
$salt = "";
$unsaltedPassword = $saltedPassword;
foreach ($decoders as $decoder) {
if (strlen($salt) >= 60)
break;
$position = $decoder['key'] % 60;
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);
}
10 votes
Ça peut être une minute ou une semaine. Cela dépend du mot de passe, du sel, de la machine utilisée pour la force brute et de l'implémentation de l'algorithme.
2 votes
Des algorithmes beaucoup plus fortement optimisés sont utilisés pour le forçage brut. Et de plus en plus de GPU.
1 votes
@timothyjc La réponse acceptée à ce message est en cours de discussion sur meta : meta.stackoverflow.com/a/370459/2378429 Les gens ont dit que c'était "un non-sens total" et "ridiculement faux". Envisageriez-vous de ne pas l'accepter ?