Hash_PBKDF2 ist eine Funktion, die von PHP bereitgestellt wird, um einen Schlüssel mit einer kennwortbasierten Hash-Funktion (PBKDF2) zu generieren. PBKDF2 ist ein Algorithmus, der die Sicherheit durch mehrere Hashing- und Salztechniken verbessert, was effektiv Brute -Kraft -Riss- und Wörterbuchangriffe verhindern kann.
<span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_pbkdf2</span></span><span>(</span><span><span class="hljs-string">"sha256"</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>, </span><span><span class="hljs-variable">$iterations</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span></span>
"SHA256" : Der Hashing-Algorithmus wurde hier mit SHA-256 ausgewählt.
$ Passwort : Das vom Benutzer eingegebene Passwort.
$ salz : zufällig erzeugter Salzwert, um die Verschlüsselungssicherheit zu erhöhen.
$ iterations : Die Anzahl der Hash -Iterationen. Je höher die Anzahl der Iterationen, desto schwieriger ist es zu knacken.
$ Länge : Die Länge des generierten Schlüssels.
Falsch : Ob Binärergebnisse ausgeben, normalerweise auf false eingestellt werden, eine hexadezimale Zeichenfolge ausgeben.
Die Sicherheit von PBKDF2 hängt vom Salzwert und der Anzahl der Iterationen ab. Das Einstellen dieser Parameter kann die Sicherheit des Schlüsselspeichers erheblich verbessern.
Bei der Erzeugung eines Schlüssels müssen Sie zunächst einen zufällig generierten Salzwert ( $ salt ) verwenden. Die Funktion des Salzwerts besteht darin, dasselbe Kennwort zu vermeiden, das denselben Schlüssel erzeugt, wodurch die Schwierigkeit des Brute-Force-Cracks weiter erhöht wird. Es wird normalerweise empfohlen, dass die Länge des Salzwerts mindestens 16 Bytes beträgt, um die Zufälligkeit zu gewährleisten.
Es ist auch wichtig, genügend Iterationen in Hash_PBKDF2 festzulegen. Theoretisch desto länger dauert es, je mehr Iterationen desto länger iteriert werden, desto länger ist es, den Schlüssel zu erzeugen und desto schwieriger ist es, ihn zu knacken. Die empfohlene Anzahl von Iterationen beträgt mindestens 100.000 Mal. Auf diese Weise benötigt der Angreifer mehr Zeit und Berechnung von Ressourcen, um den Schlüssel zu bilden.
<span><span><span class="hljs-variable">$salt</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bin2hex</span></span><span>(</span><span><span class="hljs-title function_ invoke__">random_bytes</span></span><span>(</span><span><span class="hljs-number">16</span></span><span>)); </span><span><span class="hljs-comment">// erzeugen16Zufallssalzwert von Bytes</span></span><span>
</span><span><span class="hljs-variable">$iterations</span></span><span> = </span><span><span class="hljs-number">100000</span></span><span>; </span><span><span class="hljs-comment">// Mindestens100,000Diese Iteration</span></span><span>
</span><span><span class="hljs-variable">$key</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_pbkdf2</span></span><span>(</span><span><span class="hljs-string">"sha256"</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>, </span><span><span class="hljs-variable">$iterations</span></span><span>, </span><span><span class="hljs-number">64</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>); </span><span><span class="hljs-comment">// 64Byteschlüssel</span></span><span>
</span></span>
Es ist sehr unsicher, das ursprüngliche Passwort des Benutzers direkt zu speichern. In PHP sollte der Hash -Wert des Schlüssels immer gespeichert werden, nicht die ursprüngliche Kennwortzeichenfolge. Der von Hash_PBKDF2 generierte Schlüssel wurde oft verschlüsselt und verarbeitet, und das ursprüngliche Kennwort kann theoretisch nicht daraus wiederhergestellt werden.
Beispielsweise kann der generierte Schlüsselwert in einer Datenbank gespeichert und mit anderen Informationen vom Benutzer gespeichert werden:
<span><span><span class="hljs-comment">// Speichern Sie wichtige Hash- und Salzwerte in die Datenbank</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO users (username, password_hash, salt) VALUES (?, ?, ?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>]);
</span></span>
Um die Sicherheit des Schlüssels weiter zu verbessern, kann ein stärkerer Verschlüsselungsalgorithmus in Betracht gezogen werden, um den gespeicherten Schlüssel zu verschlüsseln. Beispielsweise können die erzeugten Schlüssel unter Verwendung eines symmetrischen Verschlüsselungsalgorithmus wie AES verschlüsselt und gespeichert werden. In diesem Fall beruht der Schlüsselspeicher nicht nur auf den von PBKDF2 generierten Hash, sondern auch auf einer zusätzlichen Verschlüsselungsschicht.
<span><span><span class="hljs-variable">$encryption_key</span></span><span> = </span><span><span class="hljs-string">'your-secure-encryption-key'</span></span><span>;
</span><span><span class="hljs-variable">$encrypted_key</span></span><span> = </span><span><span class="hljs-title function_ invoke__">openssl_encrypt</span></span><span>(</span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-string">'AES-256-CBC'</span></span><span>, </span><span><span class="hljs-variable">$encryption_key</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$iv</span></span><span>);
</span></span>
Beachten Sie, dass Sie beim Verschlüsseln eines Schlüssels den sicheren Speicher des Verschlüsselungsschlüssels ( $ Encryption_key ) sicherstellen müssen. Der Verschlüsselungsschlüssel selbst sollte an einem hochsicheren Ort wie einem Hardware -Sicherheitsmodul (HSM) oder einem wichtigen Verwaltungsdienst gespeichert werden.
Neben dem Schutz des Schlüssels selbst ist auch die Sicherheit der gesamten Datenbank von entscheidender Bedeutung. Stellen Sie sicher, dass der Datenbankzugriff streng gesteuert wird und verwenden Sie starke Kennwörter und verschlüsselte Verbindungen wie SSL/TLS, um Angriffe und Datenverletzungen von Man-in-the-Middle zu verhindern.
Die Datenbank sollte das Prinzip der Mindestberechtigungen übernehmen, und nur autorisierte Benutzer können auf sensible Daten zugreifen.
Um die langfristige Sicherheit zu verbessern, sind regelmäßige Aktualisierungen der Schlüssel- und Salzwerte ebenfalls eine effektive Sicherheitsmaßnahme. Obwohl die Aktualisierung des Schlüssels nicht einfach ist, kann das Risiko einer Leckage verhindert werden, wenn der Salzwert regelmäßig aufgeweckt und der Salzwert ersetzt werden kann.
Nachdem sich der Benutzer angemeldet hat, kann der Benutzer aufgefordert werden, sein Passwort regelmäßig zu ändern und den Speicher mit einem neuen Salzwert und Schlüssel erneut zu entschlüsseln.
Die Verhinderung von SQL -Injektionsangriffen ist ein grundlegender Schritt, um die sichere Speicherung von Schlüssel zu gewährleisten. Stellen Sie sicher, dass die Benutzereingabe in Datenbankabfragen vollständig entkommen sind, oder verwenden Sie Vorverarbeitungsanweisungen, um SQL -Injektionsanfälligkeiten zu vermeiden.
Für Brute-Force-Rissangriffe kann das Risiko verringert werden, indem die Anzahl der Anmeldeversuche, die Einführung von Verifizierungscode-Mechanismen und die Überwachung des verdächtigen Anmeldungsverhaltens eingeführt werden.