147 votes

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

J'ai essayé à plusieurs reprises de changer le mot de passe d'un utilisateur sur diverses machines Linux et lorsque le nouveau mot de passe était similaire à l'ancien, le système d'exploitation se plaignait qu'ils étaient trop similaires.

Je me suis toujours demandé comment le système pouvait le savoir. Je pensais que le mot de passe était enregistré sous forme de hachage. Cela signifie-t-il que lorsque le système est en mesure de comparer le nouveau mot de passe pour en vérifier la similitude, l'ancien mot de passe est en fait enregistré en texte clair ?

155voto

slhck Points 209720

Puisque vous devez fournir à la fois l'ancien et le nouveau mot de passe lorsque vous utilisez passwd ils peuvent être facilement comparés en clair, en mémoire, sans avoir à les écrire quelque part sur le disque.

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 n'importe quel autre programme peut accéder aux choses que vous avez entrées sur votre clavier pendant qu'il lisait STDIN.

Il s'agit d'une caractéristique de la Système PAM qui est utilisé en arrière-plan de la passwd outil. PAM est utilisé par les distributions Linux modernes.

Plus précisément, pam_cracklib est un module pour PAM qui permet de rejeter les mots de passe en fonction de plusieurs faiblesses qui les rendraient très vulnérables.

Il n'y a pas que les mots de passe trop similaires qui peuvent être considérés comme peu sûrs. Le site code source propose 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 le site pam_cracklib page de manuel.

46voto

Damiano Verzulli Points 446

Au moins dans mon Ubuntu, le message "trop similaire" apparaît. quand : "...plus de la moitié des personnages sont différents...." (voir ci-dessous pour plus de détails). grâce au support PAM, comme expliqué clairement dans la réponse de @slhck.

Pour les autres plates-formes, où PAM n'est pas utilisé, le message "trop similaire" apparaît lorsque : "...plus de la moitié des personnages sont différents...." (voir ci-dessous pour plus de détails)

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

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

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

Comme nous avons affaire à des technologies Open Source, nous avons un accès illimité au code source. Pour l'obtenir, rien de plus simple :

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 du fichier "obscure.c" donne ceci (je ne coupe et colle que le morceau de code concerné) :

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 y a une fonction "similaire" qui, en se basant sur l'ancien et le nouveau, vérifie si les deux sont similaires. Voici l'extrait :

/*
 * 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 plateformes conscientes de PAM et celles qui ne le sont pas est définie dans le fichier "obscure.c" qui est structuré de la manière suivante :

#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 */

36voto

Cort Ammon Points 2336

La réponse est bien plus simple que vous ne le pensez. En fait, c'est presque de la magie, car une fois que vous avez expliqué le tour, il disparaît :

$ 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 tapé l'ancien juste un instant avant.

7voto

m8labs Points 113

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

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

5voto

odyth Points 2016

Un aspect n'a pas été couvert : l'historique des mots de passe. Certains systèmes le permettent. Pour ce faire, il conserve un historique des mots de passe et les crypte avec le mot de passe actuel. Lorsque vous changez de mot de passe, il utilise l'"ancien" mot de passe pour décrypter la liste et la vérifier. Et lorsqu'il définit un nouveau mot de passe, il enregistre la liste (à nouveau) chiffrée avec une clé dérivée du nouveau mot de passe.

C'est ainsi que remember=N fonctionne dans PAM (stocké dans /etc/security/opasswd ). Mais Windows et d'autres fournisseurs Unix proposent également des fonctions similaires.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X