Un mot de passe hachéé peut-il être récupéré si le hachage est effectué avec Crypt à base de Crypt Fonction In PHP et le hachage et le sel sont connus par l'attaquant?
Considérez l'exemple suivant:
$salt = 'mysalt';
$pass = 'mypass';
$hashed_pass = crypt($pass, $salt);
// $hashed_pass = myDUAMR/WMo7.
Je sais que John le ripper peut casser cela, mais cela ne retournera pas le mot de passe, mais il retournera une chaîne pouvant être utilisée pour créer la même valeur de hachage. Le mot de passe réel peut-il être récupéré dans le scénario donné?
John The Ripper travaille en essayant des mots de passe possibles, très rapidement. Ce ne sera pas Toujours briser une crypte basée sur des des des des des des des des dessers, ou du moins pas facilement.
Avec la fonction de hachage basée sur la des des des des des des des des des des des des des des des des des des des des Treaux, des mots de passe peuvent avoir jusqu'à 8 caractères et seulement 7 bits sont utilisés pour chaque caractère (le bit supérieur est ignoré). Considérant que le mot de passe est saisi à un moment donné par un utilisateur sur un clavier, on peut supposer qu'il y a 95 valeurs possibles pour chaque caractère (caractères ASCII de l'espace [32] à tilde [127]), d'où 6704780954517121 des mots de passe potentiels (c'est-à-dire 1 + 95 + 952 + 953 + ... + 958). C'est beaucoup beaucoup; Enumérant toutes les possibilités sur un PC prendra au moins quelques semaines. Mais il est encore réalisable technologiquement.
DES est une fonction de cryptage, mais la crypte basée sur la destruction est non des; La fonction interne est modifiée (par le sel, nommément), exécutée 25 fois et, plus important encore, les rôles de la clé et du message sont échangés. Le résultat final est que le nom "Crypt" est incorrect (bien que traditionnel): ce n'est plus un cryptage fonction; Il devrait s'appeler le hasch "basé sur la destruction ". Ce que cela signifie qu'il pourrait y avoir (et même il y a) deux mots de passe distincts qui ont atteint la même valeur (même s'ils utilisent le même sel). Par exemple, ce blog post montre qu'avec le sel "hi
", à la fois "cqjmide
" et "ifpqgio
" hachage à la même valeur "hiH9IOyyrrl4k
" (Le blog post affirme que c'est la première collision publique connue publiquement, qui montre à quel point le problème est intéressant car il n'est pas difficile: ce sont des valeurs de 64 bits, donc le coût de la recherche d'un La collision est d'environ 232 invocations de crypt()
; que la première collision publiée n'est apparue que à la fin de 2010, ne prouve que personne n'a réellement essayé avant cela).
(Remarque: contrairement à ce que le blog post dit, la possibilité de trouver des collisions n'a aucune influence sur la sécurité du système de hachage de mot de passe. Le hachage de la des des des des des des des des des des des des des des des des des des des des des OP n'a plus raison de produire de telles collisions, Mais parce qu'il a trop de petits espaces d'entrée et de sortie, et est trop rapide.)
Par conséquent, seul du sel et du hachage seul, il n'ya aucun moyen de classer "le" mot de passe, car l'information n'est tout simplement pas là. Grâce à l'énumération de tous les mots de passe possibles, on peut créer la liste des mots de passe correspondants, mais il n'y a aucun moyen de dire lequel est celui de l'utilisateur. Toutefois, et c'est le point important ici, la machine qui utilise le résultat du hachage basé sur des des techniques dans un système de vérification de mot de passe ne peut pas indiquer: tout mot de passe correspondant à la valeur du sel et de hachage est Un bon mot de passe, aussi réel que tout autre. Si le sel et le hachage sont "hiH9IOyyrrl4k
", Alors "cqjmide
" et "ifpqgio
" sont acceptés: même si votre mot de passe était "CQJMIDE", je peux Connectez-vous toujours sous votre nom en utilisant "IFPQGIO" comme mot de passe.
Remarque, cependant, que la grande majorité des valeurs de hash possibles ont un seul mot de passe correspondant, la recherche exhaustive trouvera donc ce mot de passe et aucun autre.
Sur une note similaire, étant donné que seuls les huit premiers caractères sont utilisés, vous pouvez avoir un mot de passe long de 40 caractères, dont les 32 derniers caractères seront totalement ignorés par le hachage basé sur des des ONS. Il n'ya aucun moyen de récupérer ceux de la valeur de hachage puisqu'ils sont simplement tombés et n'ont aucune influence sur le hachage calculé.
Vous ne pouvez pas éventuellement calculer toutes les collisions d'un mot de passe donné (à l'aide de votre algorithme de hachage), ils sont infinis. Si John peut vous donner un mot de passe correspondant au hasch Digest, vous pouvez récupérer théoriquement le mot de passe réel. Mais tu ne peux pas :
Le mieux que vous puissiez faire pour trouver le mot de passe serait d'essayer une attaque de dictionnaire et de faire une hypothèse que l'utilisateur a utilisé un mot de ce dictionnaire (ou des variations que vous êtes disposés à calculer). Vous êtes moins susceptible de trouver deux collisions de deux mots de dictionnaire distincts. Cela vous donnerait donc une bonne certitude d'avoir le mot de passe d'origine. Mais bien sûr, ce n'est que des statistiques.