Aktueller Standort: Startseite> Neueste Artikel> [Wie erzeugt man ein sicheres Salz in PHP? Der richtige Weg, das Sie wissen müssen

[Wie erzeugt man ein sicheres Salz in PHP? Der richtige Weg, das Sie wissen müssen

gitbox 2025-06-15

Bei der Verwendung von Hash_PBKDF2 für die Kennwortverschlüsselung ist Salz eine Schlüsselkomponente bei der Gewährleistung der Sicherheit. Obwohl viele Entwickler wissen, dass Hash_PBKDF2 eine kennwortbasierte wichtige Abgabefunktion ist, ignorieren sie, wie Salz richtig und sicher generiert und verwendet werden kann. In diesem Artikel wird die Rolle von Salz , gemeinsamen Missverständnissen und die empfohlenen Praktiken zur Erzeugung sicherer Salze in PHP eingehend erklärt.

1. Warum ist Salz von entscheidender Bedeutung?

Die Rolle von Salz besteht darin, das Risiko von Regenbogentischangriffen und das gleiche Passwort zu verhindern, das denselben Hash erzeugt. Ohne Salz benötigt ein Angreifer nur eine Passwort-Hash-Tabelle, um das Klartextkennwort umzukehren. Durch die Zugabe von Salz wird jede Verschlüsselung eindeutig, und selbst wenn zwei Benutzer dasselbe Passwort festlegen, sind ihre Hash -Werte völlig unterschiedlich.

2. Einführung in Hash_PBKDF2

Der Funktionsprototyp von Hash_PBKDF2 von PHP lautet wie folgt:

 <span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-title function_ invoke__">hash_pbkdf2</span></span><span> (
    </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$algo</span></span><span>,
    </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$password</span></span><span>,
    </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$salt</span></span><span>,
    </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$iterations</span></span><span>,
    </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>,
    </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$binary</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>
)
</span></span>

Der $ -Salt -Parameter wird verwendet, um die Einzigartigkeit des Hashs zu erhöhen, sodass die Art und Weise, wie er erzeugt wird, entscheidend ist.

3.. Häufige Fehler

  1. Verwenden Sie eine feste Zeichenfolge als Salz:

     <span><span><span class="hljs-variable">$salt</span></span><span> = </span><span><span class="hljs-string">'123456'</span></span><span>;
    </span></span>

    Dies ist ein sehr gefährliches Verhalten. Festes Salz bedeutet, dass die Hash -Werte für alle Benutzer wahrscheinlich wiederholt werden.

  2. Generieren Sie mit einfachen Funktionen:

    Beispielsweise sind Funktionen wie uniqid () und mt_rand () entweder nicht zufällig genug oder können vorhergesagt werden.

     <span><span><span class="hljs-variable">$salt</span></span><span> = </span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>();
    </span></span>

    Obwohl es scheinbar einzigartig ist, fehlt es ausreichend Entropie und wird für Sicherheitszwecke nicht empfohlen.

4.. Der richtige Weg, um Salz sicher zu erzeugen

Es wird empfohlen, PHP-bereitgestellte Funktionen auf Verschlüsselungssicherheitsebene zu verwenden, um Salz zu generieren:

 <span><span><span class="hljs-variable">$salt</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">// 16 Byte = 128 Bisschen</span></span><span>
</span></span>

Wenn Sie es als Zeichenfolge speichern müssen (z. B. in einer Datenbank speichern), können Sie Bin2hex () oder Base64_CODE () verwenden, um zu codieren:

 <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">// 32 Hexadezimale Zeichenfolge von Zeichen</span></span><span>
</span></span>

5. Vollständiges Nutzungsbeispiel

Hier finden Sie ein vollständiges Beispiel dafür, wie Sie Kennwörter mithilfe von Hash_PBKDF2 sicher verschlüsseln können:

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">hashPassword</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$password</span></span></span><span>) {
    </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">// Sicher erzeugen salt</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-variable">$algo</span></span><span> = </span><span><span class="hljs-string">'sha256'</span></span><span>;
    </span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-number">64</span></span><span>;

    </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-variable">$algo</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><span class="hljs-keyword">return</span></span><span> [
        </span><span><span class="hljs-string">'salt'</span></span><span> =&gt; </span><span><span class="hljs-variable">$salt</span></span><span>,
        </span><span><span class="hljs-string">'hash'</span></span><span> =&gt; </span><span><span class="hljs-variable">$hash</span></span><span>,
        </span><span><span class="hljs-string">'algo'</span></span><span> =&gt; </span><span><span class="hljs-variable">$algo</span></span><span>,
        </span><span><span class="hljs-string">'iterations'</span></span><span> =&gt; </span><span><span class="hljs-variable">$iterations</span></span><span>
    ];
}

</span><span><span class="hljs-comment">// Beispiel Verwendung</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hashPassword</span></span><span>(</span><span><span class="hljs-string">'MySecretPassword'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>

6. Wie überprüfen Sie das Passwort?

Bei der Überprüfung des Passworts müssen Sie das ursprüngliche Salz , die Iterationen und das Algo aus der Datenbank vorlesen und den Hash zum Vergleich auf die gleiche Weise regenerieren:

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">verifyPassword</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$password</span></span></span><span>, </span><span><span class="hljs-variable">$storedHash</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">$algo</span></span><span> = </span><span><span class="hljs-string">'sha256'</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-number">64</span></span><span>) {
    </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-variable">$algo</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><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$storedHash</span></span><span>, </span><span><span class="hljs-variable">$hash</span></span><span>);
}
</span></span>

Hash_Equals können Timing -Angriffe verhindern und sind beim Vergleich von Hashs eine sichere Wahl.

7. Schlussfolgerung

Um Hash_PBKDF2 sicher zu verwenden, besteht der Schlüssel darin, ein starkes Zufallssalz zu erzeugen und eine ausreichende Anzahl von Iterationen festzulegen. Verwenden Sie keine statischen oder niedrigen Entropie -Salze , sonst zerstören sie die Sicherheit des gesamten Verschlüsselungsprozesses. Im Bereich der Kennwortsicherheit gibt es kein sogenanntes "Gebrauch" und jedes Detail ist es wert, ernst zu nehmen. Ich hoffe, dieser Artikel kann Ihnen helfen, die richtige Erzeugung von Salz in Hash_PBKDF2 zu verstehen, um eine sichere PHP -Anwendung zu erstellen.