Frage Woher weiß Linux, dass das neue Passwort ähnlich wie das vorherige ist?


Ein paar Mal habe ich versucht, ein Benutzerpasswort auf verschiedenen Linux-Rechnern zu ändern, und als das neue Passwort dem alten ähnlich war, beschwerte sich das OS, dass sie sich zu ähnlich waren.

Ich habe mich immer gefragt, woher weiß das System das? Ich dachte, dass das Passwort als Hash gespeichert wird. Bedeutet dies, dass wenn das System in der Lage ist, das neue Passwort für Ähnlichkeit zu vergleichen, das alte tatsächlich als reiner Text gespeichert wird?


140
2017-12-27 17:22


Ursprung


Erstens: Klartext? Nein. Wenn (!) Gespeichert wird, speichern Sie den Hash und vergleichen Hashes. In Linux überprüft es jedoch das aktuelle Passwort mit einem neuen Passwort. BOTH werden vom Benutzer beim Ändern von Passwörtern bereitgestellt. - Rinzwind
@Rinzwind Aber das Vergleichen von Hashes funktioniert nicht, weil ein Unterschied von einem Zeichen zu einem völlig anderen Hash führen sollte - slhck
Siehe auch Speichert Facebook Klartext-Passwörter? auf Informationssicherheit für andere Möglichkeiten, Ähnlichkeit zu erkennen, wenn nur der Hash des alten Passworts und der Klartext des neuen Passworts gegeben sind (kein Klartext für alt). - Bob
Sie können tatsächlich die Ähnlichkeit zwischen einem alten Hash-Passwort und einem neuen Klartext-Passwort testen. Erstellen Sie einfach eine Liste von Kennwörtern, die der neuen ähnelt, hash sie alle und vergleichen Sie die resultierenden Hashes mit dem alten Passwort-Hash. Wenn irgendein Match, dann ist es ähnlich. - BWG
@BWG: Das ist eine leichte Vereinfachung - aktuelle Hash-Schemata salzen den Hash, also müssen Sie zuerst das Salz aus dem alten Passwort-Hash extrahieren und sicherstellen, dass Sie dieses Salz für Ihre ähnlich neuen Passwörter verwenden. (Ich weise darauf hin, weil es möglich ist, dass die API keinen Weg zum Erzwingen eines bestimmten Salzes darstellt.) - Ulrich Schwarz


Antworten:


Da müssen Sie sowohl die alten liefern und das neue Passwort bei der Verwendung passwdSie können einfach im Klartext, im Speicher verglichen werden, ohne sie irgendwo auf der Festplatte zu schreiben.

In der Tat wird Ihr Passwort gehashed, wenn es schließlich gespeichert wird, aber bis das geschieht, kann das Tool, mit dem Sie Ihr Passwort eingeben, natürlich direkt auf es zugreifen, wie jedes andere Programm auf Dinge zugreifen kann, die Sie während des Lesens von STDIN eingegeben haben.

Dies ist ein Merkmal der PAM-System welches im Hintergrund der verwendet wird passwd Werkzeug. PAM wird von modernen Linux-Distributionen verwendet.

Genauer, pam_cracklib ist ein Modul für PAM, das es ermöglicht, Passwörter aufgrund mehrerer Schwächen abzulehnen, die sie sehr anfällig machen würden.

Es sind nicht nur zu ähnliche Passwörter, die als unsicher angesehen werden können. Das Quellcode  hat verschiedene Beispiele von was überprüft werden kann, z.B. ob ein Passwort ein Palindrom ist oder wie groß der Bearbeitungsabstand zwischen zwei Wörtern ist. Die Idee ist, Passwörter widerstandsfähiger gegen Wörterbuchangriffe zu machen.

Siehe auch das pam_cracklib Manpage.


154
2017-12-27 19:27



hast du Ideen in "wie" deine Erklärung zu den Argumenten passt, die in meiner Antwort enthalten sind? Gibt es zwei verschiedene Ansätze, die von der "passwd" -Anwendung verwendet werden, wenn Host ist nicht PAM-bewusst? PS .: Keine Kritik. Ich frage mich nur (wie PAM, BTW, war meine erste Schätzung ... kurz vor dem Quellcode). - Damiano Verzulli
Noch beunruhigender sind die Corporate-Passwortregeln, die Sie warnen, wenn Sie unter den letzten vier das gleiche oder ein ähnliches Passwort verwendet haben. - Nick T
@NickT Wie ist das (unbedingt) beunruhigend - konnten sie nicht nur deine letzten 4 Hashes speichern, dann vergleiche jedes von ihnen mit deinem vorgeschlagenen Neuen genauso wie diese Frage? - neminem
@neminem "... oder ähnlich" - Nick T
@NickT Ah, fair genug, denn in diesem speziellen Fall vergleichen Sie mit dem "alten Passwort", das der Benutzer eingegeben hat, um das Passwort zu ändern, und nicht gegen einen gespeicherten Hash. Immernoch du könnte hypothetisch die in einem Kommentar gepostete Methode BWG verwenden, um zumindest wirklich einfache Änderungen zu überprüfen (eine Zeichensubstitution, ein Zeichen hinzugefügt / entfernt, etc.). - neminem


Zumindest in meinem Ubuntu kamen die "zu ähnlichen" Nachrichten heraus wann: "... mehr als die Hälfte der Charaktere sind andere ..." (siehe unten für Details). Dank der PAM-Unterstützung, wie in der @slhck-Antwort klar erklärt.

Für andere Plattformen, auf denen PAM nicht verwendet wird, erscheinen die "zu ähnlichen" Nachrichten, wenn: "... mehr als die Hälfte der Charaktere sind andere ..." (siehe unten für Details)

Um diese Aussage weiter zu überprüfen, ist es möglich, den Quellcode zu überprüfen. Hier ist, wie.

Das "passwd" -Programm ist im passwd-Paket enthalten:

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

Da es sich um Open-Source-Technologien handelt, haben wir uneingeschränkten Zugriff auf Quellcode. Es ist so einfach wie:

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

Danach ist es einfach, das relevante Code-Fragment zu finden:

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");

Eine schnelle Überprüfung der "obscure.c" gibt dies heraus (ich schneide nur das relevante Stück Code aus):

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;
}

So, jetzt wissen wir, dass es eine "ähnliche" Funktion gibt, die auf der alten und der neuen prüft, ob beide ähnlich sind. Hier ist der Ausschnitt:

/*
 * 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;
}

Ich habe den C-Code nicht überprüft. Ich habe mich darauf beschränkt, dem Kommentar kurz vor der Funktionsdefinition zu vertrauen :-)


Die Unterscheidung zwischen PAM- und NON-PAM-fähigen Plattformen wird in der Datei "obscure.c" definiert, die wie folgt strukturiert ist:

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

45
2017-12-28 18:14



Dies ist eine lange Antwort, die nicht direkt die Frage beantwortet, wie sie mit dem alten Passwort verglichen werden kann, wenn Passwörter gehashed werden. - jamesdlin
@jamesdlin: wie in Rinzwind kommentiert Kommentar zur ursprünglichen Frage, tun Hashes NICHT spielen Sie eine Rolle in dieser Angelegenheit: Wenn Sie den "passwd" -Befehl zum Ändern des Passworts eingeben, müssen Sie sowohl das "alte" als auch das "neue" Passwort angeben. So hat der "passwd" -Code überhaupt kein Problem beim Vergleichen / Überprüfen des Passworts auf einmal (in klaren Formen; überhaupt nicht gehasht). - Damiano Verzulli
@DamianoVerzulli Trotzdem geht das nicht wirklich auf die Frage ein. Die Frage war nicht, "welcher C-Code benutzt du um zu sagen, ob zwei Strings ähnlich sind"; Das ist für Passwörter genauso wie für alles andere. Die Sache über Passwörter das macht es interessant, dass sie nie im Klartext gespeichert werden, und darum geht es in der Frage. Dies beantwortet "welche Kriterien werden verwendet und wie wird es in C gemacht", aber es ist viel zu lang für "welche Kriterien" und "wie würde ich das in C machen" ist eine SO-Frage, keine SU-Frage. - cpast
@DamianoVerzulli Und die Tatsache, dass passwd fragt nach alten und neuen Passwörtern ist die Antwort. Der Rest dieser Antwort ist irrelevant. - jamesdlin
+1 für und äußerst relevante und interessante Antwort! Es ist schön zu sehen, dass der eigentliche Code, der das Passwort vergleicht, tatsächlich auf dem Klartext und, wie erwartet, nicht auf dem Hash funktioniert. - nico


Die Antwort ist viel einfacher als Sie denken. In der Tat, es qualifiziert sich fast als Magie, denn sobald Sie den Trick erklären, ist es weg:

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

Password changed successfully

Es weiß, dass dein neues Passwort ähnlich ist ... Weil du das alte Passwort gleich eingegeben hast.


37
2017-12-29 13:41



"... oder Süßigkeiten." - Nick T
Silly Hase, Trix sind für Kinder! - iAdjunct
Was es nicht erklärt, ist, wenn es Ihre Vergangenheit n Kennwörter kennt :) "Passwort wurde vor kurzem verwendet", das verhindert, dass die gleichen wenigen Passwörter in einer Unternehmensumgebung ausgetauscht werden. - Juha Untinen
@Juha Untinen: Das stimmt, aber das kann gehandhabt werden, indem man sich einfach an die letzten N Hashes erinnert. Das "selbe wie Nth password" zu fangen ist einfach, es ist das "ähnlich zu Nth Passwort "das ist schwer. Soweit mir bekannt ist, diese Systeme nur auf Ähnlichkeit mit dem letzten Passwort und Gleichheit mit dem letzten N. Prüfen sie auf Ähnlichkeit mit dem letzten N ... das ist ein wirklich interessant Trick jetzt, nicht wahr, ich habe keine Ahnung, wie sie das machen würden. - Cort Ammon


Obwohl die anderen Antworten richtig sind, ist es vielleicht erwähnenswert, dass Sie das alte Passwort nicht benötigen, damit es funktioniert!

In der Tat kann man eine Menge von Passwörtern erzeugen, die dem neuen Passwort entsprechen, die Sie angegeben haben, sie hashen und dann prüfen, ob einer dieser Hashes mit dem alten übereinstimmt. Wenn dies der Fall ist, wird das neue Passwort ähnlich wie das alte vergeben! :)


8
2018-01-02 11:06



Während dies tatsächlich ein Mittel ist, um dieses Kunststück zu erreichen (und von vielen Websites verwendet wird), ist das in diesem Fall nicht so. - Brian S
Das ist ein netter Trick! Ein bisschen rechenintensiver, aber clever! - Cort Ammon
Sie sollten zumindest eine Schätzung darüber geben, wie viele ähnliche Kennwörter generiert werden müssten, um eine aussagekräftige Prüfung durchzuführen oder eine Verbindung zu externen Ressourcen herzustellen. Ansonsten ist dies nur eine Idee einer möglichen Alternative, keine fundierte Antwort. - hyde
@hyde, das hängt von Kriterien ab, an die jemand denken kann. Für mich sind Passwörter ähnlich, wenn maximal 3 Zeichen hinzugefügt / entfernt / geändert wurden. Also das sind 62 Hashes für jedes Zeichen (und das ist, wenn wir nur alphanumerische Zeichen verwenden) mal die Kombination von 3 aus der Länge des Passworts (n), welches ist 62 * (n!)/(6 * (n - 3)!), was 13540 für ein 12 Zeichen langes Passwort entspricht. Aber wenn jemand an etwas anderes denkt, ist die Gleichung nutzlos. Warum also die Mühe machen? - Killah
Dumme Antwort, aber trotzdem eine Einsicht. Warum dumm? 1. Sie müssten eine unvorstellbare Anzahl von Hashes generieren. 2. Ein solches Setup würde die Sicherheit des ursprünglichen Passworts schwächen. Wenn jemand Hashes aller ähnlichen Passwörter anstelle von nur einem Hash erhält, hätten sie viel leichter Zeit, es zu knacken. - Rok Kralj


Ein Aspekt wurde nicht behandelt: Passwortverlauf. Einige Systeme unterstützen dies. Um dies zu tun, speichert es Passwörter und verschlüsselt sie mit dem aktuellen Passwort. Wenn Sie Ihr Passwort ändern, verwendet es das "alte" Passwort, um die Liste zu entschlüsseln und zu verifizieren. Und wenn es ein neues Passwort setzt, speichert es die Liste (wieder) verschlüsselt mit einem Schlüssel, der von dem neuen Passwort abgeleitet ist.

Das ist wie remember=N arbeitet in PAM (gespeichert in /etc/security/opasswd). Aber auch Windows und andere Unix-Anbieter bieten ähnliche Funktionen.


4