In freier Wildbahn haben wir eine Benutzertabelle. Eine Benutzertabelle hat normalerweise die
ID | Benutzername | Salz | encrypted_password | horridly_insecure_reset_key ======================================================== ========================= 1 | user1 | foo | 09b6d39aa22fcb8698687e1af09a3af9 | NULL2 | user2 | bar | 6c07c60f4b02c644ea1037575eb40005 | NULL3 | user3 | baz | 09b6d39aa22fcb8698687e1af09a3af9 | Zurücksetzen
Dann sieht eine Authentifizierungsmethode wie folgt aus:
def authenticate (Benutzer, Passwort) u = User.find (Benutzer: Benutzer) return u. encrypted_password == encrypt (password + u.salt) end
Durch ein Salt pro Benutzer wird sichergestellt, dass Sie das Kennwort für user2 nicht herausfinden können, selbst wenn das Kennwort für Benutzer1 bekannt ist oder user3 ohne ihr Salz.
Sie stellen außerdem sicher, dass Sie das Salz nicht herausfinden können, indem Sie über eine Reihe verschlüsselter Kennwörter verfügen und einige verschlüsselte Kennwörter ausprobieren.
Im Wesentlichen auf diese Weise jeder Angriff gegen a Benutzer muss von vorne gestartet werden.
Selbst wenn ein Angreifer eine Liste von Benutzern und Salzen hat, muss er immer noch gegen jeden einzelnen Benutzer vorgehen, um festzustellen, ob ein Kennwort übereinstimmt. Wenn Sie einen Pool von Salzen oder ein statisches Salz hatten, könnte ich wissen, dass das Passwort von Benutzer1 ein Passwort ist, und dann einfach alle übereinstimmenden verschlüsselten Passwörter finden. Auf diese Weise werden sie zumindest ein wenig langsamer.
Wenn wir uns nun die Salze ansehen, wollen wir die Wiederverwendung von Salz reduzieren. Zwei identische Salze erleichtern den Angreifern. Wenn zwei Personen dasselbe Salt und dasselbe Passwort verwenden, wird der andere Benutzer beschädigt, wenn ein Benutzer beschädigt wird.
Nehmen wir also an, wir verwenden nur diese drei Salze. Und wir haben 3000 Benutzer. Das heißt, 1000 Menschen haben das gleiche Salz. Wenn 1% von ihnen ein Passwort von "Passwort" haben, können diese Personen alle gleichzeitig geknackt werden. 10 Accounts werden gleichzeitig gehackt. Weil wir die drei Salze kennen. Das ist eine sehr einfache Strecke, um 30 Leute gleichzeitig anzugreifen.
Nun, wenn jedes Salz einzigartig ist. Und wir wissen, dass das Passwort von Benutzer1 ein Passwort ist, das Ihnen nichts nützt. Sie haben immer noch nur 1 Benutzer geknackt. Für alle anderen 2999 Benutzer müssen Sie noch "Kennwort + Salt = verschlüsseltes Kennwort" ausführen.
Ein wirklich wichtiger Hinweis.
Sicherheit durch Dunkelheit ist keine Sicherheit. Das bedeutet nicht, dass Sie Ihre Benutzertabelle auf Google veröffentlichen sollten, da dies albern ist. Bei der Messung der Sicherheit sollten Sie jedoch davon ausgehen, dass der Angreifer über alles verfügt. Sie können nicht sagen: "Aber sie kennen das Anwendungssalz nicht, weil sie den Quellcode nicht haben." Weil sie konnten. Das bedeutet nicht, dass Sie Ihre Salze verschenken, es bedeutet nur, dass es keine echte Sicherheit ist. Angenommen, sie haben den Benutzernamen und das Salt und versuchen dann, es ihnen zu erschweren, das Passwort zu erhalten.
SUPER WICHTIGER HINWEIS
Die Der hier verwendete Code und die Tabelle sind für den tatsächlichen Gebrauch etwa 9.000 Mal zu einfach. Das Passwort ist nicht verschlüsselt, die Salze sind zu kurz, die Methode ist etwas zu simpel, kurz gesagt, so etwas in der Produktion zu tun, ist nichts, was als sicher angesehen werden sollte. Ich habe diese Sache dort einfach zum Zwecke der Demonstration ausgewählt, nicht weil sie sicher sind.