Frage

Was ist der beste Weg, Benutzer-Account-Management in einem System zu handhaben, ohne Ihre Mitarbeiter zu haben, den Zugriff auf eine Datenbank haben, Zugang zu den Konten zu haben.

Beispiele:

  1. Speichern von Benutzername / Passwort in der Datenbank. Dies ist eine schlechte Idee, weil jeder, der Zugriff auf eine Datenbank hat, kann den Benutzernamen und das Passwort sehen. Und damit es verwenden.

  2. Speichern von Benutzername / Passwort-Hash. Dies ist eine bessere Methode, aber das Konto kann durch Ersetzen des Passwort-Hash in der Datenbank mit dem Hash von einem anderen Konto, dass Sie die Auth zugegriffen wird Informationen für kennen. Dann, nachdem der Zugriff gewährt es zurück in die Datenbank zurückkehrt.

Wie funktioniert Windows / * nichts damit umgehen?

War es hilfreich?

Lösung

Dies war ein weit verbreitetes Problem in UNIX vor vielen Jahren, und wurde durch die Trennung der Benutzeridentität Komponenten (Benutzername, UID, Shell, vollständiger Name, etc.) von den Authentifizierungskomponenten (Passwort-Hash, Passwort-Hash-Salz) aufgelöst. Die Identität Komponenten können global lesbar sein (und in der Tat muss es sein, wenn UIDs sind Benutzernamen abgebildet werden), aber die Authentifizierungskomponenten muss für Benutzer nicht zugänglich gehalten werden. Um einen Benutzer zu authentifizieren, haben ein vertrauenswürdiges System, das einen Benutzernamen und ein Passwort akzeptiert, und wird ein einfaches Ergebnis von „authentifiziert“ oder „nicht authentifiziert“ zurückzukehren. Dieses System sollte die einzige Anwendung mit Zugriff auf die Authentifizierungsdatenbank sein und sollte für eine zufällige Zeit (vielleicht zwischen 0,1 und 3 Sekunden) warten, bevor er antwortete Angriffe helfen zu vermeiden Timing.

Andere Tipps

  

Dies ist eine bessere Methode, aber das Konto kann durch Ersetzen des Passwort-Hash in der Datenbank mit dem Hash von einem anderen Konto, dass Sie die Auth zugegriffen wird Informationen kennen.

Es gibt wirklich keinen Weg, um dieses. Wer als Schreibzugriff auf die Passwort-Datei die vollständige Kontrolle über den Computer hat.

Ich würde mit 2 gehen, aber etwas Salz verwenden. Einige Pseudo-Code:

SetPassword(user, password)
    salt = RandomString()
    hash = Hashfunction(salt+password)
    StoreInDatabase(user, salt, hash)

CheckPassword(user, password)
    (salt, hash) = GetFromDatabase(user)
    if Hashfunction(salt+password) == hash
        return "Success"
    else
        return "Login Failed"

Es ist wichtig, in einer Bibliothek, eine gut bekannte Hash-Funktion (wie zum Beispiel MD5 oder SHA-1), umgesetzt zu verwenden. Sie nicht Ihre eigene Rolle oder versuchen, es aus einem Buch Umsetzung sein gerade nicht wert, das Risiko des Erhaltens es falsch.

@ Brian R. Bondy: Der Grund, warum Sie Salz verwenden ist Wörterbuch attaks schwieriger zu machen, kann der Angreifer nicht ein Wörterbuch Hash und versuchen, gegen alle Passwörter, sondern sie haben das Salz nehmen + das Wörterbuch und Hash es, wodurch der Speicher requierments expode. Wenn Sie ein Wörterbuch der 1000 die meisten commaon Passwörter und Hash sie benötigen Sie so etwas wie 16 kB, aber wenn Sie zwei zufällige Buchstaben hinzufügen, erhalten Sie 62 * 62 * 16 kB ≈ 62 Mb.

sonst könnte man eine Art von Einmalpasswörter ich gut gehört haben, Dinge über otpw aber havent verwendet es.

Jeff Atwood hat einige gute Beiträge Hashing über, wenn Sie sich entscheiden, diesen Weg zu gehen:

Sie könnten OpenID verwenden und keine vertraulichen Benutzerpasswörter überhaupt speichern. Wer hat gesagt, es für andere Web-Sites nur?

  1. Eine sehr schlechte Idee, in der Tat. Wenn die Datenbank beeinträchtigt wird, werden alle Konten kompromittiert.
  2. Guter Weg zu gehen. Wenn Ihr Hash-Algorithmus, um den Benutzernamen enthält, mit einem anderen Passwort-Hash-Ersatz wird nicht funktionieren.

Unix speichert Hashes in eine Textdatei / etc / shadow, die nur für privilegierte Benutzer zugänglich ist. Passwörter werden verschlüsselt mit einem Salz.

Sie können speichern Sie das Salz für das Hash-Passwort in einer anderen Tabelle, natürlich jeder Benutzer ihr eigenes Salz hat. Sie könnten dann Zugriff auf diese Tabelle begrenzen.

Die übliche Vorgehensweise ist Option zwei mit E-Mail zu verwenden:

Speichern von Benutzernamen, ein Passwort-Hash-und E-Mail-Adresse in die Datenbank.

Die Benutzer können entweder Eingang ihr Passwort oder zurücksetzen, im letzteren Fall ein zufälliges Passwort generiert wird, wird eine neue Hash wird für den Benutzer erstellt und das Passwort wird ihm per E-Mail gesendet werden.

Edit:. Wenn die Datenbank gefährdet ist, dann können Sie nur keine sinnvollen Informationen garantieren können zugegriffen werden, können Sie nicht mehr die Sicherheit Ihrer Anwendung gewährleisten

Hash der Benutzername und das Passwort zusammen . Auf diese Weise, wenn zwei Benutzer das gleiche Passwort haben, werden die Hash-Werte immer noch unterschiedlich sein.

Diese

ist ein bisschen ein Problem nicht für viele Anwendungen, da Zugriff auf die Datenbank zu gewinnen ist wahrscheinlich die häufigste Ziel eines jeden Angreifer. Also, wenn sie bereits Zugriff auf die Datenbank haben, warum sie immer noch an die Anwendung anmelden wollen? :)

Wenn das ‚System‘ eine öffentliche Website RPX können Sie mit einem Login / Benutzerkonto Diensten für die gängigste Anbieter, wie OpenID, Facebook, Google, etc.

Nun, angesichts der Art und Weise Sie Ihre Frage formulieren Ich denke, das ‚System‘ Sie sprechen mehr ist wahrscheinlich eine interne Windows / Linux-basierte Enterprise-App. Dennoch; für diejenigen, googeln für Login / Benutzerkonto-Anbieter um (wie ich es tat, bevor ein über RPX kam), könnte dies eine gute Passform sein:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top