Comment Linux sait-il que le nouveau mot de passe est similaire au précédent?


145

Quelques fois, j'ai essayé de modifier le mot de passe d'un utilisateur sur différentes machines Linux. Lorsque le nouveau mot de passe était similaire à l'ancien, le système d'exploitation s'est plaint de leur similitude.

Je me suis toujours demandé comment le système le sait-il? Je pensais que le mot de passe est enregistré sous forme de hachage. Cela signifie-t-il que lorsque le système est capable de comparer le nouveau mot de passe pour la similarité, l'ancien est réellement enregistré en tant que texte brut?


30
1er arrêt: texte brut? non. Si (!) Est enregistré, vous enregistrez le hachage et comparez les hachages. Sous Linux, il vérifie le mot de passe actuel avec le nouveau mot de passe. LES DEUX sont fournis par l'utilisateur lors du changement de mot de passe.
Rinzwind

42
@Rinzwind Mais comparer les hachages ne fonctionnera pas, car une différence d'un caractère devrait donner un hachage complètement différent
slhck

17
Voir aussi Facebook stocke-t-il les mots de passe en texte brut? sur la sécurité de l'information pour d'autres moyens de détecter la similarité étant donné uniquement le hachage de l'ancien mot de passe et le texte en clair du nouveau mot de passe (pas de texte en clair pour l'ancien).
Bob

21
Vous pouvez réellement tester la similarité entre un ancien mot de passe haché et un nouveau mot de passe en texte clair. Générez simplement une liste de mots de passe similaires au nouveau, hachez-les tous et comparez les hachages résultants à l'ancien hachage de mot de passe. Si une correspondance existe, alors c'est similaire.
BWG

2
@BWG: C'est une légère simplification excessive - les schémas de hachage actuels salent le hachage, vous devez donc d'abord extraire le sel de l'ancien hachage du mot de passe et vous assurer que vous utilisez ce sel pour vos mots de passe similaires aux nouveaux. (Je le signale car il est possible que l'API n'expose pas un moyen de forcer un sel spécifique.)
Ulrich Schwarz

Réponses:


156

Étant donné que vous devez fournir à la fois l'ancien et le nouveau mot de passe passwd, vous pouvez facilement les comparer en texte clair, en mémoire, sans les écrire quelque part sur le lecteur.

En effet, votre mot de passe est haché lorsqu’il est finalement stocké, mais jusqu’à ce que cela se produise, l’outil dans lequel vous entrez votre mot de passe peut bien sûr y accéder directement comme tout autre programme peut accéder aux éléments que vous avez entrés sur votre clavier alors qu’il lisait depuis STDIN.

Il s'agit d'une fonctionnalité du système PAM utilisée en arrière-plan de l' passwdoutil. PAM est utilisé par les distributions Linux modernes.

Plus spécifiquement, pam_cracklibest un module pour PAM qui permet de rejeter les mots de passe en fonction de plusieurs faiblesses qui les rendraient très vulnérables.

Ce ne sont pas seulement les mots de passe trop similaires qui peuvent être considérés comme non sécurisés. Le code source contient divers exemples de ce qui peut être vérifié, par exemple si un mot de passe est un palindrome ou quelle est la distance d'édition entre deux mots. L'idée est de rendre les mots de passe plus résistants aux attaques par dictionnaire.

Voir aussi la pam_cracklibpage de manuel.


Avez-vous des idées dans "comment" votre explication correspond aux arguments rapportés dans ma réponse? Existe-t-il deux approches différentes, prises par l'application "passwd", lorsque l'hôte n'est pas compatible avec PAM? PS: Pas de critique du tout. Je me demandais simplement (comme PAM, BTW, c'était ma première hypothèse ... juste avant de récupérer le code source).
Damiano Verzulli

27
Les règles de mot de passe d'entreprise qui vous alertent si vous avez utilisé le même mot de passe ou un mot de passe similaire parmi les quatre derniers sont plus troublantes.
Nick T

4
@ NickT En quoi cela dérange-t-il (nécessairement) - ne pourrait-il pas simplement sauvegarder vos 4 derniers hashes, puis comparer chacun de ceux-ci à votre nouveau proposé de la même manière que cette question?
Neminem

1
@neminem "... ou similaire"
Nick T

1
@ NickT Ah, ça va, parce que dans ce cas particulier, vous comparez à "l'ancien mot de passe" qui est entré par l'utilisateur pour changer le mot de passe, plutôt qu'à un hachage enregistré. Néanmoins, vous pouvez utiliser de manière hypothétique la méthode BWG publiée dans un commentaire, pour au moins vérifier les modifications les plus simples (substitution d’un caractère, ajout / suppression d’un caractère, etc.).
Neminem

46

Au moins dans mon Ubuntu, les messages "trop ​​similaires" disparaissent when: "... plus de la moitié des personnages sont différents ...." (voir ci-dessous pour plus de détails). grâce au support de PAM, comme expliqué clairement dans la réponse @slhck.

Pour les autres plates-formes, où PAM n'est pas utilisé, les messages "trop ​​similaires" apparaissent lorsque: "... plus de la moitié des caractères sont différents ...." (voir ci-dessous pour plus de détails)

Pour vérifier davantage cette déclaration par vous-même, il est possible de vérifier le code source. Voici comment.

Le programme "passwd" est inclus dans le package passwd:

verzulli@iMac:~$ which passwd
/usr/bin/passwd
verzulli@iMac:~$ dpkg -S /usr/bin/passwd
passwd: /usr/bin/passwd

En ce qui concerne les technologies Open Source, nous avons un accès illimité au code source. Le faire est aussi simple que:

verzulli@iMac:/usr/local/src/passwd$ apt-get source passwd

Ensuite, il est facile de trouver le fragment de code correspondant:

verzulli@iMac:/usr/local/src/passwd$ grep -i -r 'too similar' .
[...]
./shadow-4.1.5.1/NEWS:- new password is not "too similar" if it is long enough
./shadow-4.1.5.1/libmisc/obscure.c:     msg = _("too similar");

Une vérification rapide de "obscure.c" donne ceci (je ne fais que copier-coller le morceau de code correspondant):

static const char *password_check (
    const char *old,
    const char *new,
    const struct passwd *pwdp)
{
    const char *msg = NULL;
    char *oldmono, *newmono, *wrapped;

    if (strcmp (new, old) == 0) {
            return _("no change");
    }
    [...]
    if (palindrome (oldmono, newmono)) {
            msg = _("a palindrome");
    } else if (strcmp (oldmono, newmono) == 0) {
            msg = _("case changes only");
    } else if (similar (oldmono, newmono)) {
            msg = _("too similar");
    } else if (simple (old, new)) {
            msg = _("too simple");
    } else if (strstr (wrapped, newmono) != NULL) {
            msg = _("rotated");
    } else {
    }
    [...]
    return msg;
}

Donc, maintenant, nous savons qu'il existe une fonction "similaire" basée sur l'ancien et le nouveau chèque si les deux sont similaires. Voici l'extrait de code:

/*
 * more than half of the characters are different ones.
 */
static bool similar (const char *old, const char *new)
{
    int i, j;

    /*
     * XXX - sometimes this fails when changing from a simple password
     * to a really long one (MD5).  For now, I just return success if
     * the new password is long enough.  Please feel free to suggest
     * something better...  --marekm
     */
    if (strlen (new) >= 8) {
            return false;
    }

    for (i = j = 0; ('\0' != new[i]) && ('\0' != old[i]); i++) {
            if (strchr (new, old[i]) != NULL) {
                    j++;
            }
    }

    if (i >= j * 2) {
            return false;
    }

    return true;
}

Je n'ai pas revu le code C. Je me suis limité à faire confiance au commentaire juste avant la définition de la fonction :-)


La différenciation entre les plates-formes compatibles PAM et non-PAM est définie dans le fichier "obscure.c" qui est structuré comme suit:

#include <config.h>
#ifndef USE_PAM
[...lots of things, including all the above...]
#else                           /* !USE_PAM */
extern int errno;               /* warning: ANSI C forbids an empty source file */
#endif                          /* !USE_PAM */

9
C’est une longue réponse qui ne semble pas répondre directement à la question de savoir comment comparer l’ancien mot de passe lorsque les mots de passe sont hachés.
jamesdlin

10
@jamesdlin: comme indiqué dans Rinzwind commentaire à la question initiale, hash ne pas jouer aucun rôle dans cette affaire: lorsque vous exécutez la commande « passwd » pour changer le mot de passe, vous devez fournir à la fois le mot de passe « ancien » et « nouveau ». Ainsi, le code "passwd" n'a aucun problème à comparer / vérifier le mot de passe en même temps (sous forme claire; pas de hachage du tout).
Damiano Verzulli

3
@DamianoVerzulli Néanmoins, cela ne règle pas vraiment la question. La question n'était pas "quel code C utilisez-vous pour dire si deux chaînes sont similaires;" c'est exactement la même chose pour les mots de passe et pour toute autre chose. Ce qui les rend intéressants à propos des mots de passe, c'est qu'ils ne sont jamais stockés en texte clair, et c'est ce que la question demande. Ceci répond "quels critères sont utilisés et comment cela se fait en C", mais c'est beaucoup trop long pour "quels critères" et "comment ferais-je cela en C" est une question SO, pas une question SU.
cpast

7
@DamianoVerzulli Et le fait de passwddemander des mots de passe anciens et nouveaux est la solution . Le reste de cette réponse n'est pas pertinent.
jamesdlin

3
+1 pour et réponse extrêmement pertinente et intéressante! Il est agréable de voir que le code comparant le mot de passe actuel fonctionne sur le texte en clair et, comme prévu, pas sur le hachage.
nico

36

La réponse est beaucoup plus simple que vous ne le pensez. En fait, cela peut presque être qualifié de magie, car une fois que vous expliquez le truc, il est parti:

$ passwd
Current Password:
New Password:
Repeat New Password:

Password changed successfully

Il sait que votre nouveau mot de passe est similaire ... Parce que vous avez saisi l'ancien un instant auparavant.


2
"... ou des bonbons."
Nick T

1
Silly Rabbit, Trix sont pour les enfants!
Premier

1
Ce qu’elle n’explique pas, c’est quand il connaît vos n mots de passe antérieurs :) "Le mot de passe a été utilisé trop récemment", ce qui empêche de permuter les mêmes mots de passe dans un environnement d’entreprise.
Juha Untinen

3
@Juha Untinen: C'est vrai, mais cela peut être géré simplement en se souvenant des N derniers hachages. Capturer "même mot de passe que le nième mot de passe" est facile, c’est le " mot de passe semblable au nième mot" qui est difficile. Autant que je sache, ces systèmes vérifient uniquement la similarité avec le dernier mot de passe et la similitude avec le dernier N. S'ils vérifient la similitude avec le dernier N ... c'est un truc vraiment intéressant maintenant, n'est-ce pas! Je ne sais pas comment ils feraient ça.
Cort Ammon

7

Bien que les autres réponses soient correctes, il peut être intéressant de mentionner que vous n'avez pas besoin de fournir l'ancien mot de passe pour que cela fonctionne!

En fait, il est possible de générer un groupe de mots de passe similaire au nouveau mot de passe que vous avez fourni, de les hacher, puis de vérifier si l'un de ces hachages correspond à l'ancien. Si tel est le cas, le nouveau mot de passe est jugé similaire à l'ancien! :)


2
Bien que ce soit effectivement un moyen de réaliser cet exploit (et que de nombreux sites Web l'utilisent), ce n'est pas ce qui se passe dans ce cas.
Brian S

C'est un bon truc! Un peu plus intensif en calcul, mais intelligent!
Cort Ammon

Vous devez au moins donner une estimation du nombre de mots de passe similaires à générer pour obtenir une vérification significative ou un lien vers une ressource externe. Sinon, il ne s'agit que d'une idée de solution de rechange possible, et non d'une réponse fondée.
Hyde

@hyde qui dépend de critères auxquels on pourrait penser. Pour moi, les mots de passe sont similaires s’il y avait un maximum de 3 caractères ajoutés / supprimés / modifiés. Cela correspond donc à 62 hachages pour chaque caractère (et si nous n'utilisons que des caractères alphanumériques) fois la combinaison de 3 à partir de la longueur de password ( n), ce 62 * (n!)/(6 * (n - 3)!)qui correspond à 13540 pour un mot de passe de 12 caractères. Mais si quelqu'un pense à quelque chose de différent, l'équation est inutile, alors pourquoi s'en préoccuper?
Killah

Réponse stupide, mais un aperçu quand même. Pourquoi bête? 1. Vous devez générer un nombre inimaginable de hachages. 2. Une telle configuration affaiblirait la sécurité du mot de passe d'origine. Si quelqu'un obtenait des hachages de tous les mots de passe similaires au lieu d'un seul, ils auraient beaucoup plus de temps pour le déchiffrer.
Rok Kralj

5

Un aspect n'était pas couvert: l'historique des mots de passe. Certains systèmes supportent cela. Pour ce faire, il conserve un historique des mots de passe et les chiffre avec le mot de passe actuel. Lorsque vous modifiez votre mot de passe, il utilise l'ancien mot de passe pour déchiffrer la liste et vérifier. Et quand il définit un nouveau mot de passe, il enregistre la liste (à nouveau) cryptée avec une clé dérivée du nouveau mot de passe.

Voici comment cela remember=Nfonctionne dans PAM (stocké dans /etc/security/opasswd). Mais Windows et d'autres fournisseurs Unix offrent également des fonctions similaires.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.