Speichern Sie Benutzer und übergeben Sie eine einzelne Tabelle oder eine separate Tabelle

8

Ich möchte ein Benutzerverwaltungssystem für meine Site erstellen,

Was ist besser für Sicherheit und Leistung.

Geben Sie 1 ein:

%Vor%

oder

Geben Sie 2 ein:

%Vor%

welcher ist besser?

    
Ata 10.11.2012, 14:22
quelle

4 Antworten

19

Idealerweise:

  • Speichern Sie keine Passwörter (auch nicht verschlüsselt). Speichern Sie Hashes , die von Passwörtern abgeleitet sind.
  • Salt die Passwörter zu verhindern Regenbogenattacken .
  • Put Hashes auf einem separaten Datenbankserver, hinter seiner eigenen Firewall und seiner eigenen gut definierten API 1 . Diese API sollte nur drei Dinge tun:
    1. Ermitteln Sie für einen gegebenen Benutzernamen den entsprechenden Passwort-Hash.
    2. Geben Sie für einen bestimmten Benutzernamen den neuen Hash ein (um das Zurücksetzen des Passworts zu unterstützen).
    3. Entfernen Sie den angegebenen Benutzernamen und seinen Hash (um die Aufhebung der Benutzerregistrierung zu unterstützen).
  • Machen Sie dasselbe für Salze: Legen Sie sie auf ihren eigenen Server und hinter ihre eigene Firewall und API. Diese API sollte nur drei Dinge tun:
    1. Für den angegebenen Benutzernamen, rufen Sie das entsprechende Salz ab.
    2. Geben Sie für den angegebenen Benutzernamen das neue Salz auf einen zufälligen Wert ein (um das Zurücksetzen des Kennworts zu unterstützen).
    3. Entfernen Sie den angegebenen Benutzernamen und sein Salt (um die Aufhebung der Benutzerregistrierung zu unterstützen).
  • Sowohl Hash- als auch Salt-Server sollten von der Welt (und voneinander) abgeschnitten sein und nur von dem Server aus zugänglich sein, auf dem Ihre Web-Anwendung läuft (zB PHP oder ASP.NET oder was auch immer ...).

Wenn der Benutzer sich anzumelden versucht, indem er seinen Benutzernamen und sein Passwort eingibt:

  • Stellen Sie sicher, dass dies über HTTPS erfolgt, damit die eingegebenen Daten den Code Ihrer Website sicher erreichen.
  • Rufen Sie die API auf, die den Kennwort-Hash für den Benutzernamen abruft.
  • Rufen Sie die API auf, die das Salz für den Benutzernamen abruft.
  • Salt und hash das Passwort vom Benutzer eingegeben und vergleichen Sie es mit dem abgerufenen Hash.
  • Wenn sie übereinstimmen, erhält der Benutzer den Zugriff.

Hashes sind von Natur aus irreversibel - anders als der Benutzer kennt niemand, nicht einmal Sie, das genaue Passwort. Wenn der Benutzer das Passwort vergisst, können Sie ihm das Passwort nicht senden, aber Sie können ihm erlauben, das Passwort zurückzusetzen, vorausgesetzt, dass es eine zusätzliche Überprüfung besteht (dh Zugriff auf eine bestimmte E-Mail-Adresse hat und / oder ein Geheimnis beantwortet) Frage).

BTW, Anmeldung ist eine relativ seltene Operation, es ist also unwahrscheinlich, dass es zu einem Leistungsengpass kommt, wenn Sie die ordnungsgemäße Indizierung nicht völlig ignorieren.

1 z. Implementieren Sie einen Webdienst, und öffnen Sie dann nur den Port, der für diesen Webdienst erforderlich ist, und sonst nichts.

    
Branko Dimitrijevic 10.11.2012, 21:21
quelle
4

Ich werde mit Option 1 gehen.

Denken Sie, es gibt ein paar Nutzer. Um die Benutzerdaten zu erhalten, müssen Sie also mit n Tabellen statt mit 1 Tabelle arbeiten, was natürlich LOAD auf dem Server hinzufügt und Sie schließlich BAD PERFORMANCE haben werden.

Also würde ich mit Option 1 gehen.

Für tel. number, add field als Festnetznummer, handy_number, alternate_number als addierendes Feld in der Tabelle wird nicht so viel Unterschied machen als das Hinzufügen einer Tabelle für das Feld.

Und ja, nach Steve Kommentar, Passwort mit sicheren Hash-Mechanismus speichern.

Welche Option wählen Sie?

    
Fahim Parkar 10.11.2012 14:46
quelle
1

Es kommt darauf an. Wenn Sie die Passworthistorie behalten möchten und der Benutzer viele Telefonnummern haben kann, erstellen Sie zusätzliche Tabellen für Passwörter und Telefone. In anderen Fällen genügt eine Tabelle.

    
kpater87 10.11.2012 14:25
quelle
1

Erstens sollten Sie, wie @Steve sagt, Passwörter mit einem sicheren Hash-Mechanismus speichern - die Speicherung von Klartext-Passwörtern ist unverantwortlich - es bedeutet, dass jeder, der in Ihr System eindringen kann, Benutzerpasswörter kennt, die sie möglicherweise auf anderen Seiten wieder verwendet haben .

Zweitens gibt es in beiden Entwürfen keinen inhärenten Sicherheits- oder Leistungsvorteil - aus Sicherheitsgründen müssen Sie davon ausgehen, dass ein Angreifer, der Zugriff auf Ihre Datenbank erhält, Abfragen ausführen kann, und es wäre einfach zu finden Daten in beiden Systemen. Aus der Sicht der Leistung ist es unwahrscheinlich, dass die Kosten der Joins in Option 2 von Bedeutung sind, wenn Sie primäre / fremde Schlüsselindizes haben.

Wenn Sie nach einem bestimmten Zeitraum die Passwörter neu festlegen müssen und den Passwortverlauf speichern müssen, um zu verhindern, dass Benutzer Kennwörter erneut verwenden (dies ist ein Feature, das Windows beispielsweise unterstützt), müssen Sie einen " UserPassword "-Tabelle mit den Spalten valid_from und valid_until.

    
Neville Kuyt 10.11.2012 14:38
quelle