Reicht ein 'wenn Passwort == XXXXXXX' für minimale Sicherheit aus?

20

Wenn ich ein Login für eine App mit mittlerem bis niedrigem Sicherheitsrisiko erstelle (dh keine Banking-App oder ähnliches), kann ich ein vom Benutzer eingegebenes Passwort bestätigen, indem ich Folgendes sage:

if(enteredPassword == verifiedPassword)
     SendToRestrictedArea();
else
     DisplayPasswordUnknownMessage();

Es scheint einfach, effektiv zu sein, aber es würde mir sicherlich nichts ausmachen, wenn das alles war, was erforderlich war. Reicht eine einfache Überprüfung der Kombination aus Benutzername und Passwort aus?

Update: Das jeweilige Projekt ist zufällig ein Webdienst, die Überprüfung erfolgt ausschließlich auf Serverseite und ist nicht Open Source. Ändert die Domain, wie Sie damit umgehen würden?

Morgan Herlocker
quelle
3
kommt es darauf an, woher validPassword kommt? Wenn es fest codiert ist, können Sie das Passwort nicht konfigurieren / ändern, ohne den Code zu ändern. Wenn es aus einer Konfigurationsdatei stammt, ist es für jeden sichtbar, der darauf zugreift.
Alb
1
"Ist eine Überprüfung der Kombination aus Benutzername und Passwort ausreichend", um was zu tun?
Chris
3
@opinion: Es scheint unwahrscheinlich, dass dies SCHLECHTER ist, als kein Login zu haben. Bitte begründen Sie eine derart starke Behauptung.
Morgan Herlocker
1
Ihre Terminologie ist falsch, wenn Sie ein Kennwort vergleichen, um es zu überprüfen, und nicht um sicherzustellen, dass es gültig ist. Bitte nehmen Sie sich die Zeit, um den Unterschied zu verstehen.
billy.bob
1
Dies impliziert die Speicherung von Klartextkennwörtern, was nicht verantwortungsbewusst ist. Dies bedeutet auch, dass ein Benutzer darauf hingewiesen wird, dass das Kennwort falsch ist, was einem potenziellen Angreifer zu viele Informationen liefert. Sie sollten immer mehrdeutig sein, dh "Login oder Passwort falsch".
Rein Henrichs

Antworten:

26

Nicht ohne SSL

Dies ist nicht sicher, wenn das Passwort im Klartext über das Netzwerk gesendet wird. Das Hashing des Kennworts auf der Serverseite ist auch nicht sicher, wenn das Kennwort im Klartext über das Netzwerk gesendet wird.

Da das HTML- <input type="password"/>Tag seinen Inhalt im Klartext sendet, ist dies ein Problem, unabhängig davon, wie Sie das Kennwort auf dem Server speichern, es sei denn, Ihre Website verwendet SSL zur Übermittlung des Kennworts.

(Die HTTP-Authentifizierung, bei der ein Dialogfeld im Browser angezeigt wird, in dem Sie nach einem Kennwort gefragt werden, kann je nach den vom Server und vom Browser gemeinsam verwendeten Authentifizierungsmechanismen als Klartext angezeigt werden. Auf diese Weise kann dies möglicherweise vermieden werden, ohne die Option zu verwenden SSL.)

Nicht, wenn die Site-Administratoren verdächtig sind

Angenommen, Sie verwenden HTTPS für die Ausführung der Website. Dies kann sicher sein, wenn Sie Ihren Site-Administratoren (die Klartext-Kennwörter lesen können) und anderen Personen, die Zugriff auf den Computer haben, vertrauen, um sich ordnungsgemäß zu verhalten. Nun mag es offensichtlich sein, dass sie mit Ihrer Website alles tun können, was sie wollen (da sie sie verwalten), aber wenn sie das Passwort lesen können, können sie möglicherweise auch die gestohlenen Login / Passwort-Paare auf den Websites anderer Personen verwenden.

Eine Möglichkeit, um Passwörter vor dem Administrator zu schützen

Eine sichere Methode zum Speichern und Überprüfen von Passwörtern ist folgende:

def change_password user, new_password
  salt = random(65536).to_s(16) #will be 4 characters long
  password_hash = salt + hash(salt + new_password)
  store(user,password_hash)
end

def does_password_match? user, entered_password
  correct_password_hash = retrieve(user)
  salt = correct_password_hash[0...4]
  entered_password_hash = salt + hash(salt + entered_password)
  return correct_password_hash == entered_password_hash
end

Versuchen Sie, für die Hash-Funktion etwas Starkes und etwas zu verwenden, das noch keine guten Regenbogentabellen in freier Wildbahn hat. Sie können die Länge des Salzes bei Bedarf ändern, indem Sie an Regenbogentischen arbeiten.

Abhängig von der Umgebung, in der Sie sich befinden, der Variabilität Ihrer Netzwerklatenz und der Frage, ob Benutzernamen öffentlich bekannt sein sollen, möchten Sie möglicherweise einen anderen Codepfad berechnen, hash('0000'+entered_password)wenn der Benutzer nicht vorhanden ist, um Angreifer daran zu hindern Feststellen, welche Benutzernamen gültig sind, basierend auf der Zeit, die benötigt wird. Feststellen, dass das Kennwort falsch ist.

Ken Bloom
quelle
1
Gute Ratschläge :) In Bezug auf SSL mussten wir etwas entwickeln, das im Verborgenen funktioniert , und verwendeten einfach asymetrische Kryptografie, um das Passwort zu verschlüsseln (erfordert Javascript) und es dann auf dem Server zu dekodieren. Der Salt + Hash tritt dann normal auf. Da der öffentliche Schlüssel zusammen mit der Webseite gesendet wird, kann er sich auch beliebig oft ändern.
Matthieu M.
1
@Matthieu M .: Wenn jemand Ihre Webseite fälschen kann, kann er dort auch den öffentlichen Schlüssel in einen ändern, in dem er selbst den entsprechenden privaten Schlüssel kennt. Ihre Idee hilft also nur gegen passive Leseangriffe, nicht gegen Man-in-the-Middle.
Paŭlo Ebermann
@Paulo: Ja, ich stimme zu, dass es bei SSL nicht nur um Verschlüsselung, sondern auch um Zertifikat geht. Leider gehe ich hier nicht auf Nummer sicher und wenn Leute sagen, dass sie die Webseite mit einer regulären http://Verbindung verwenden möchten, ist das frustrierend: /
Matthieu M.
@Matthieu: Bedeutet das, dass Sie public_key als Teil der öffentlichen Webseite encrypt(entered_password, public_key)senden, auf dem Client rechnen und dieses Ergebnis an den Server senden, der die Leistung erbringt does_password_match?(user, decrypt(encrypted_password, private_key))?
Ken Bloom
@ Ken: Mehr oder weniger hast du die richtige Verschlüsselung. Zum Abgleichen des Passworts ist es mehr does_password_match(user, salt, decrypt(encrypted, key)), wobei das Salz vom Benutzer abhängt. Wie gesagt, das offensichtliche Problem ist der Mangel an Man-in-the-Middle-Schutz.
Matthieu M.
52

Das würde bedeuten, dass Sie Kennwörter in offenem Text halten, was selbst in Szenarien mit geringer Sicherheit ein No-No ist.

Du solltest lieber haben:

if(hash(enteredPassword) == storedHash)

Sie können einfachen Hash wie zum Beispiel MD5 verwenden

vartec
quelle
22
+1 für das Hashing des Passworts. Aber ich würde wenigstens auch etwas Salz hinzufügen. Andernfalls, da Benutzer Benutzernamen und Kennwörter zwischen Systemen wiederverwenden, kann ein Angreifer durch einen Verstoß gegen Ihre App mit niedriger Sicherheit möglicherweise eine App mit viel höherer Sicherheit verletzen. Der jüngste HBGary-Hack hat es beispielsweise geschafft, das CMS-System, auf dem die Website ausgeführt wird, in einen Root-Zugriff auf die Server zu verwandeln, da das CMS-System mit geringer Sicherheit Hashes nicht mit Salz versetzte. Arstechnica.com/tech-policy/ news / 2011/02 /…
Justin Cave
1
Zustimmen ... Folgendes beachten .. "strings JavaFile.class | grep -i password"
Bill
Was ist das Problem mit dem Passwort im Klartext, wenn sie nur einmal verwendet werden?
10
@ Tim , weil die Benutzer nicht nur einmal das Passwort verwenden. Studien belegen durchweg, dass Benutzer Kennwörter mehrmals wiederverwenden (z. B. theregister.co.uk/2011/02/10/password_re_use_study ), unabhängig davon, wie oft sie dazu aufgefordert werden.
Scott
3
@Tim: Öffnen Sie außerdem einfach Ihre Exe, DLL usw. in einem Texteditor, und Sie werden wahrscheinlich Ihr Passwort genau dort sehen.
Gus Cavalcanti
14

Ich stimme mit denen überein, die das Haschisch vorschlagen, aber es gibt auch ein Rad, das Sie hier neu erfinden. Abhängig von der Plattform finden Sie wahrscheinlich ein Rollen- / Benutzerverwaltungs-Tool, das alle Benutzerverwaltungsaufgaben sicher und sicher abdeckt, ohne dass Sie zu viel eingreifen müssen.

Glenatron
quelle
Ich habe gerade erst ASP.Net Membership Providers entdeckt, aber sie haben sich gefragt, wie oft ich meine Zeit damit verbracht habe, so etwas zu implementieren.
Glenatron
8

Sicherheit ist ein sehr heikles Thema, insbesondere weil es ein Gleichgewicht zwischen der Beeinträchtigung Ihrer Benutzer und der Gewährleistung der Sicherheit ihrer Informationen geben muss. In der Regel hängt die Formel für die von Ihnen benötigte Sicherheit von der Wichtigkeit der Daten ab. Zusamenfassend:

isSecuritySufficient = effortToBreak > rewardForBreaking

Ein weit verbreitetes Missverständnis über Menschen, die schlechte Dinge tun, ist das, wonach sie streben. Die meisten von ihnen sind darauf aus, das Vertrauen zu zerstören . Sie sollten immer alles tun, um das Vertrauen Ihrer Benutzer zu schützen. Ein Teil davon ist Ihre Sorgfalt, um sicherzustellen, dass ihre Identität sicher ist. Sie interessieren sich vielleicht weniger für die Daten, die sie speichern, aber für ihre Identität - selbst bei der niedrigsten Sicherheitsschwelle.

Es gibt eine Reihe von kostengünstigen Optionen (für die Implementierung und Auswirkung auf den Benutzer). Eines davon ist das Hashing des Passworts auf ein Minimum. Jeder Dienst, der etwas so Vertrauliches wie ein Passwort im Klartext speichert, verdient die Verlegenheit, gehackt zu werden.

Allgemeine Grundsätze für den Passwortschutz

  • Speichern Sie Passwörter niemals im Klartext
  • Hash mit einer sicheren Hash-Funktion wie SHA-1 oder sogar SHA-512 (selbst MD5 ist zu einfach, um einen passenden Hash zu finden)
  • Verwenden Sie einen Anwendungssalzwert. Das Salt besteht aus zufälligen Bytes, die entweder zu einem Kennwort hinzugefügt werden, um das Erraten zu erschweren. Das Salz sollte zur Laufzeit erzeugt werden und Informationen über die Maschine als Startwert verwenden, anstatt in irgendeiner Weise gespeichert und referenziert zu werden.
  • Verwenden Sie einen benutzerspezifischen Salzwert. Verwenden Sie dies in Verbindung mit Ihrer Anwendung Salz.
  • Verschlüsseln Sie alle Authentifizierungsanforderungen, die über ein Netzwerk gesendet werden. Das bedeutet, dass Sie SSL für Webanwendungen verwenden.

Da Sie SSL für die Authentifizierung verwenden würden, möchten Sie mindestens alle Seiten verschlüsseln, die sich auch mit dem Konto des Benutzers befassen. Auf diese Weise kann die Identität eines Benutzers so gut wie möglich geschützt werden.

Ein Hinweis zur Passwortverwaltung : Benutzer vergessen von Zeit zu Zeit ihr Passwort. Das absolut Schlimmste, was Sie tun können, ist, ihnen ihr Passwort per E-Mail zu senden. Wenn Sie die oben beschriebenen Prinzipien implementieren, können Sie das sowieso nicht. Es ist viel besser, ein Verfahren zum Zurücksetzen des Kennworts über einen Link bereitzustellen, der an die registrierte E-Mail-Adresse gesendet wird. Dieser Link zum Zurücksetzen verfügt über einen einmaligen Verwendungscode, um sicherzustellen, dass die Person, die auf die Seite zugreift, dieser Code ist.

Berin Loritsch
quelle
1
Anfangs war ich von der Idee der Anwendung salt + user salt wirklich beeindruckt, aber je mehr ich darüber nachdenke, desto weniger bin ich überzeugt. Wenn Sie beispielsweise 4 Zeichen Anwendungssalz und 4 Zeichen Benutzersalz verwendet haben, ist der Unterschied zwischen diesem und 8 Zeichen Benutzersalz nur der, dass die Hälfte des Salzes für jeden Benutzer identisch wäre. Es scheint sicherer zu sein, nur die Größe des Benutzersalzes zu erhöhen, als Anwendungssalz zu haben. Wenn das Anwendungssalz auf der Hardware basiert, können Sie die Hardware nicht aktualisieren oder ändern, ohne alle Kennwörter ungültig zu machen.
David Conrad
Das Problem besteht darin, dass das Benutzersalz mit dem Benutzerkennwort in der Datenbankzeile enthalten ist. Wenn ein schlechter Mensch weiß, wofür ein Salz ist (und was er tut) und es in der Datenbank sieht, dann weiß er, wie er es vollständig knacken kann. Indem Sie einen Teil in die Anwendung aufnehmen, der berechnet wird (jedes Mal auf die gleiche Weise), anstatt gespeichert zu werden, wird das Knacken der Benutzertabellen erheblich erschwert. Natürlich können Sie noch einen Schritt weiter gehen und 1 Teil reines Zufallssalz und 1 Teil berechnetes Salz herstellen, wobei beide benutzerspezifisch sind.
Berin Loritsch
Ah, ich verstehe, halte einen Teil des Salzes aus der Datenbank heraus. Das ergibt doch Sinn. Vielen Dank.
David Conrad
Ich sehe kein Problem darin, das Salz pro Reihe zu lagern, solange es pro Reihe eindeutig ist. Hier ist ein Hash: "fd84235a55bbfeb1585a3dd069d48127989c9753058b51b6ba2056fd6c5a0a91" (SHA256), hier ist das Salz: "671254bdf7944f8fa88e6c9913b948ee". Denken Sie, Sie können das Passwort bekommen? Es gibt keinen Regenbogentisch für dieses Salz (auch wenn man das Salz bekommt), man steckt fest und zwingt es.
Bryan Boettcher
3

Das ist in Ordnung, es sei denn, das Passwort wird für etwas anderes verwendet. Es besteht immer noch das Risiko, dass der Benutzer beschließt, das Kennwort erneut zu verwenden. Daher ist es noch besser, wenn Folgendes zutrifft:

if(hash(enteredPassword) == hashOfValidPassword)

Wenn Sie selbst oder jemandem bewusst ist, dass das Kennwort im Klartext gespeichert ist, ist dies in Ordnung.


quelle
1
Wie in Justin Cave Kommentar zu vartec Antwort, Verwendung Salz, so if (hash (enteredPassword + salt) == hashOfValidSaltedPassword)- und beachten Sie, dass die +wahrscheinlich Verkettung, nicht hinaus. Dies behindert die Verwendung von Regenbogentabellen, bei denen es sich um Hash-Tabellen mit möglichen Kennwörtern handelt.
David Thornley
Wenn Sie nur nach einem Hash suchen, können Sie dann nicht einfach eine Schleife möglicher Zeichenfolgen durchlaufen, bis derselbe Hash wie der gespeicherte Hash generiert wurde. Es gibt schließlich viele Zeichenfolgen, die demselben Hash entsprechen könnten.
Morgan Herlocker
@Prof Plum: Es ist sehr schwierig, Kollisionen zu finden, wenn der Hashing-Algorithmus gut ist. Dies ist die Grundlage der modernen Kryptographie: Sie sind im Wesentlichen Einwegfunktionen.
3

Ist der Quellcode verfügbar? Auch wenn dies nicht der Fall ist, bin ich mir ziemlich sicher, dass das Passwort in der Maschinenanleitung enthalten ist, falls die Binärdatei verfügbar ist. Ich würde empfehlen, stattdessen eine Prüfsumme zu erstellen und diese zu vergleichen.

Übersehen Sie niemals die Sicherheit, auch wenn sie Ihrer Meinung nach nicht sehr wichtig ist.

Anto
quelle
2
Ja, schlechte Idee, wenn es ein Open-Source-Projekt ist :)
-1 - Wenn Sie der Meinung sind, dass die Quelle einen Unterschied macht, wissen Sie nichts über Sicherheit.
Mattnz
1

Absolut nicht. Haben Sie einen Lese von dieser , beschreibt es , wie Hacker eine Sicherheits Website gehackt. Sie planen, Sie als das schwächste Glied in der Kette zu haben.

Dave
quelle
0

In einigen Antworten wurde darauf hingewiesen, dass Sie nicht das Kennwort selbst, sondern einen Hash speichern und SSL verwenden sollten.

Sie können sagen, was ist die große Sache? Wenn meine Anwendung gehackt wird, ist das kein Problem. Nun, es ist ein weit verbreitetes Muster, dass Benutzer auf allen Websites dasselbe Kennwort wiederverwenden. Würde ein Hacker Ihre Website hacken und Zugang zu den Passwörtern des Benutzers erhalten, wäre der Hacker in der Lage, viele dieser Benutzer auf anderen Websites auszuweisen, die für diese Benutzer von größerer Bedeutung sind. Das Hacken Ihrer Website könnte für einen Hacker der erste Schritt sein, um den Benutzern Zugang zu Bankinformationen zu verschaffen.

Und nur das Hashing des Passworts ist nicht genug. Sie müssen es mit einem Salz hacken. Hacker haben Reverse-Hash-Nachschlagetabellen, sodass sie für einen bestimmten Hash ein passendes Passwort finden können.

Wenn Sie diese Funktion nicht implementieren, sollten Sie die Benutzer über diese Sicherheitslücke informieren und sie dazu ermutigen, nicht dasselbe Kennwort zu verwenden, das sie an anderer Stelle verwenden.

Pete
quelle
-2

Solange dies serverseitig ist .. Dann ja.

Wenn Sie ein bisschen mehr Sicherheit wünschen, wählen Sie https und verschlüsseln \ hash das Kennwort in der Datenbank.

Idioten
quelle
3
Warum annehmen, dass dies eine Web-App ist?
Chris
Guter Punkt! Ich habe es gerade getan.
Morons
4
-1 Auch wenn es sich um eine Serverseite handelt, ist dies immer noch nicht in Ordnung.
GSto