Um dieses Problem zu verstehen, müssen Sie zuerst verstehen, warum wir Passwörter hashen. Es ist durchaus möglich, ein Passwort im Klartext auf einem Server zu speichern und das übertragene Passwort einfach mit dem empfangenen Passwort zu vergleichen. Solange das Passwort während der Übertragung geschützt ist, ist dies ein sicheres Mittel zur Authentifizierung (gemeinsames Geheimnis).
Der Grund, warum Passwörter gehasht werden, liegt darin, dass das Problem nicht die Authentifizierung, sondern der Speicher ist. Sollte der Server jemals kompromittiert werden, hätte der Angreifer sofort Zugriff auf alle Benutzerkonten, da er nun das zur Authentifizierung der Benutzer verwendete Geheimnis kennt.
Hashing wirkt als Hindernis dafür. Da der Server die zur Authentifizierung tatsächlich erforderlichen Eingaben nicht kennt, gewährt selbst ein Kompromiss mit der Datenbank einem Angreifer keinen Zugriff auf die Benutzerkonten. Sie müssten immer noch die Eingabe herausfinden, um die Hash-Werte zu erreichen, mit denen die Anwendung prüft. Sicher, sie könnten alle Werte in etwas ändern, das sie kennen, aber dies würde schnell Verdacht erregen und das System würde heruntergefahren und gesichert.
Das Problem beim clientseitigen Hashing ist also, dass es das effektiv macht Ergebnis des Hashs ist das Passwort und nicht das Passwort. Nichts hindert einen Angreifer daran, den offiziellen Client zu umgehen und den fertigen Hash einfach direkt an den Server zu senden. Es bietet keinen zusätzlichen (oder Verlust) an Sicherheit während der Authentifizierung, aber in dem Fall, dass Hashing zum Schutz dient, bietet es nichts, da der in der Datenbank gespeicherte Hash tatsächlich das gemeinsame Geheimnis ist, das an den Server übertragen wird.
Das heißt, es gibt zwei bemerkenswerte Dinge, die Ihnen clientseitiges Hashing bietet. Dies trägt zwar nicht zum Schutz Ihres Systems bei, kann jedoch zum Schutz Ihres Benutzers beitragen. Wenn Sie das Kennwort unsicher übertragen oder die Übertragung kompromittiert wird, ohne dass der Clientcode kompromittiert wird, schützen Sie das Kennwort des Benutzers (das auf anderen Websites möglicherweise wiederverwendet wird) weiterhin vor dem Durchsickern.
Das andere ist, dass Sie zusätzliche Iterationen eines Hashs bereitstellen können, um einen Offline-Angriff auf die Datenbank zu erschweren, ohne Serverzyklen verwenden zu müssen (und gleichzeitig die Länge des vom Client übermittelten "Zwischenkennworts" zu verlängern) Sie benötigen noch genügend Serverzyklen, um das verlängerte Kennwort vor einem nicht autorisierten Client zu schützen. Der primäre Schutz, den dies bietet, besteht wiederum darin, zu verhindern, dass das ursprüngliche Kennwort erkannt wird, trägt jedoch nicht zum Schutz des Authentifizierungsmechanismus Ihrer Site bei Aus Sicht des Servers sollte der clientseitige Hash so behandelt werden, als wäre es das direkte Passwort des Benutzers. Es bietet nicht mehr oder nicht weniger Sicherheit auf dem Server , als wenn der Benutzer sein Kennwort direkt angegeben hätte und als solches geschützt werden sollte.
Wenn Sie Um dieses zusätzliche Sicherheitsniveau bieten zu können, würde ich zwei Hashes empfehlen. Hash einmal clientseitig, um ein neues, eindeutiges Passwort zu erstellen, dann Hash dieses Passwort auf dem Server, um einen Wert zu erstellen, den Sie in der DB speichern. Auf diese Weise erhalten Sie das Beste aus beiden Welten.
Zum größten Teil wird SSL ausreichend vertraut, um den Austausch zu schützen, sodass der anfängliche Hash vor der Übertragung als unnötig angesehen wird und ein kompromittierter Server dies jederzeit ändern kann Code, der so an den Client gesendet wird, dass der anfängliche Hash nicht ausgeführt wird. Es ist einfach keine effektive Alternative zu SSL und bietet nicht genügend zusätzlichen Vorteil, um die Kosten und die Komplexität wert zu sein.