PHP-Sicherheit: Wo und wie werden Passwörter gespeichert? Teil 2

Hallo allerseits! Letzte Woche haben wir den ersten Teil dieses Artikels veröffentlicht, der einen ernsthaften Holivar verursachte.

Eine der Hauptbeschwerden war die fehlende Erwähnung von password_hash in dem Artikel, wie wir versprochen haben, der zweite Teil dieses Materials wird genauso mit Passwort-Hash unter Verwendung von password_hash . Wir erinnern Sie auch daran, dass das Schreiben dieses Artikels durch den Start einer neuen Gruppe im „Backend PHP Developer“ -Kurs inspiriert wurde, aber dieses Material hat nichts mit dem Schulungsprogramm zu tun.


Sie können sich am Tag der offenen Tür über das Schulungsprogramm informieren und anhand eines kostenlosen Webinars zum Thema „ServerLess PHP“ das Format der Vorlesungen bewerten.

Vielleicht schließen wir dieses langwierige Vorwort ab und gehen direkt zum Artikel.

Passwort-Hash mit password_hash


Diese Funktion erstellt einen Passwort-Hash gemäß den dafür festgelegten Parametern. Es wird ein Einwegalgorithmus verwendet.

Wir können wählen, welche Art von Algorithmus verwendet werden soll, indem wir eine der Konstanten unserer Wahl festlegen:

  • PASSWORD_DEFAULT von PHP 5.5 verwendet Bcrypt als Standardalgorithmus. Mit der Zeit ändert sich dies jedoch, wenn neue, sicherere Algorithmen oder andere Faktoren entdeckt werden.
  • PASSWORD_BCRYPT erstellt einen crypt() Hash. Normalerweise enthält es 60 Zeichen, es kann durch seinen Bezeichner im Format "$ 2y $" identifiziert werden.
  • PASSWORD-ARGON2I Argon2 ist derzeit einer der sichersten Hashing-Algorithmen. Es ist nur verfügbar, wenn PHP mit Argon2 kompiliert wurde.
  • PASSWORD_ARGON2ID Dieser Hash-Algorithmus gehört ebenfalls zur Argon2-Familie und verwendet die Version von Argon2ID, nicht I. Damit dies funktioniert, muss PHP auch mit Argon2 kompiliert werden.

Diese Funktion verfügt auch über einen optionalen Parameter, der aus einem assoziativen Array besteht, das gemäß dem ausgewählten Algorithmus mehrere Schlüssel akzeptiert.
Wenn Sie Bcrypt bevorzugen, ist der Schlüssel dieser Sequenz der Kostenwert.

Wenn Sie einen Algorithmus auswählen, der Argon2 verwendet, memory_cost die Schlüssel für das assoziative Array: memory_cost (eine Ganzzahl, die die maximale Speichermenge angibt, die zum Berechnen des Hash benötigt wird), time_cost (eine Ganzzahl, die die maximale Zeit angibt, die zum Berechnen des Hash benötigt wird) und thread (eine andere Ganzzahl) eine Zahl, die die Anzahl der Threads angibt, die zur Berechnung des Hash verwendet wurden).

Geben Sie den salt Parameter nicht in PHP 7.0 an, da Sie sonst eine Warnung über den veralteten Ansatz erhalten.

Jetzt wissen wir, welche Elemente für die Verwendung der Funktion password_hash() erforderlich sind. Mal sehen, wie man es verschreibt.

 echo password_hash("MySuperPass", PASSWORD_DEFAULT); $2y$10$TLayAY8ZaAZ9FE50EylGYO9oEgrb7gsw1yzJemHdBu1gOQfyWrEUm $options = ['cost' => 12,]; echo password_hash("MySuperPass", PASSWORD_BCRYPT, $options); $2y$12$jhmTbxAuZXVtX2y.Jc8iy.dW/NENqVCeq2vuoFI9/oa4./YlzhpYO echo password_hash('rasmuslerdorf', PASSWORD_ARGON2I); $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0 

Zunächst wird empfohlen, diese Funktion auf Ihren Servern zu testen und die Kostenparameter so zu konfigurieren, dass die Ausführung der Funktion auf interaktiven Systemen weniger als 100 Millisekunden dauert.

Mithilfe des Skripts im obigen Beispiel können Sie den optimalen Kostenwert für Ihre Hardware festlegen.

Überprüfung des Benutzerpassworts


Sie haben Benutzern die Möglichkeit gegeben, sich in Ihrer neuen Anwendung zu registrieren, sie können dort ihr Kennwort eingeben, und Sie wissen sehr gut, wie sie mit diesem Kennwort umgehen sollen.

Durch das Hashing von Daten gemäß den neuesten Sicherheitstrends speichern Sie nichts in verschlüsselter Form, und Ihr Server ist in einem Keller mit einer Tiefe von 10 Metern versteckt.

Was jetzt?

Jetzt müssen Sie Benutzern erlauben, sich bei der Anwendung anzumelden. Zu diesem Zweck verfügt PHP über eine integrierte Funktion, die das Kennwort überprüft, das mit der Hash-Sequenz übereinstimmt. Diese Funktion heißt password_verify() . Das funktioniert so:

 $hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; if (password_verify('rasmuslerdorf', $hash)) { echo ' !'; } else { echo '  !'; } 

Sie hat zwei Parameter und beide müssen ein Sequenzformat haben. Der erste Parameter ist das Kennwort, das der Benutzer in das Anmeldeformular für das Konto eingegeben hat. Der zweite Parameter sind die direkt gehashten Daten, mit denen wir uns beraten werden.

Als Ergebnis erhalten wir einen logischen Wert, der zur Verwendung in bedingten Operationen bereit ist. Auf diese Weise können wir den Benutzer entweder in die Anwendung einlassen oder ihm mitteilen, dass ein Fehler aufgetreten ist.

Diese Funktion funktioniert aufgrund der Tatsache, dass der von password_hash Wert im vorherigen Schritt (als wir das Passwort gehasht hatten) den von uns verwendeten Algorithmus, cost und salt enthielt.

Somit stehen uns alle für password_verify() notwendigen Informationen zur Verfügung.

Der Algorithmus des Benutzerregistrierungssystems auf PHP


Ich hoffe, Sie verstehen jetzt die Sicherheitsmaßnahmen, die PHP-Entwickler beim Umgang mit Passwörtern ergreifen.

Zuerst müssen Sie nach einer Nachanfrage suchen und dann die Anzahl der Benutzer auswählen und berechnen, deren Daten mit den eingegebenen übereinstimmen.

Wenn alles geklappt hat, überprüfen wir das Passwort und senden den Benutzer zur Startseite. Andernfalls, zum Beispiel bei Javascript, wird ein Warnfenster mit einer Fehlermeldung angezeigt.

Fazit


Jetzt wissen Sie, wie Sie die Sicherheit Ihrer Anwendung gewährleisten und wie Sie mit Passwörtern richtig umgehen. Das Befolgen nützlicher Empfehlungen ist nicht nur ein Standard, dem Sie folgen müssen, sondern ein Entwicklungspfad, dem Sie gerne folgen sollten.
Lernen Sie neue Techniken, ähnlich wie Sie sie gerade gelernt haben. Fügen Sie zusätzliche Funktionen hinzu und experimentieren Sie mit dem Code, bis Sie hervorragende Kenntnisse in der Webentwicklung haben - unabhängig davon, ob es sich um PHP oder eine andere Sprache handelt, die Ihnen nicht weniger Möglichkeiten eröffnet!

Lesen Sie den ersten Teil

Source: https://habr.com/ru/post/de475874/


All Articles