Aktueller Standort: Startseite> Neueste Artikel> Die Fallstricke verschiedener Verhaltensweisen von Crypt () in verschiedenen Systemen

Die Fallstricke verschiedener Verhaltensweisen von Crypt () in verschiedenen Systemen

M66 2025-05-25

Die Crypt () -Funktion ist eine klassische Wahl bei der Verwendung von PHP zur Verschlüsselung oder Überprüfung von Kennwörtern, insbesondere vor password_hash () und password_verify () waren in den frühen Tagen nicht verfügbar. Viele Entwickler stoßen jedoch bei der Verwendung von CryPT () auf ein verwirrendes Problem: Der gleiche Code wird in verschiedenen Betriebssystemen oder Umgebungen ausgeführt, die Ergebnisse sind jedoch inkonsistent und können sogar zu Sicherheitsrisiken führen. In diesem Artikel werden die Gründe für dieses Phänomen ausführlich untersucht und wie man diese "Gruben" vermeidet.

1. Das Grundprinzip der Crypt () -Funktion

PHPs Crypt () -Funktion wird verwendet, um Saiten in Einweg zu verschlüsseln. Seine Kernlogik besteht darin, zu wählen, welcher Verschlüsselungsalgorithmus basierend auf dem angegebenen "Salzwert" ( Salz ) verwendet werden soll. Dieser Salzwert steuert nicht nur den Algorithmus, sondern nimmt auch am Verschlüsselungsprozess teil. Zum Beispiel:

 echo crypt('password', '$1$mysalt$'); // verwenden MD5 Verschlüsselung

Verschiedene Präfixe repräsentieren verschiedene Verschlüsselungsalgorithmen:

  • $ 1 $ bedeutet mithilfe von MD5-basierter Verschlüsselung

  • $ 2A $ , $ 2y $ , $ 2 Mrd. $ bedeutet mit Blowfish (BCrypt)

  • $ 5 $ bedeutet mit SHA-256

  • $ 6 $ bedeutet mit SHA-512

2. Die Grundursache für Inkonsistenz in verschiedenen Systemen

Obwohl Crypt () eine Standardfunktion von PHP ist, stützt sich seine Implementierung auf der C -Bibliothek des zugrunde liegenden Systems (LIBC). Das heißt, PHP verkaps nur die Crypt () -Funktion auf Systemebene. Aus diesem Grund kann es signifikante Unterschiede im Verhalten von Crypt () zwischen verschiedenen Betriebssystemen geben, die wie folgt gezeigt werden:

1. Die unterstützten Verschlüsselungsalgorithmen sind unterschiedlich

Nicht alle Systeme unterstützen den gleichen Verschlüsselungsalgorithmus. Zum Beispiel:

  • Einige ältere Versionen von MacOS -Systemen unterstützen nur die traditionelle DES -Verschlüsselung.

  • Linux (insbesondere Systeme mit GNU LIBC) unterstützt normalerweise MD5, SHA-256, SHA-512, Blowfish usw.

  • Alpine Linux unterstützt einige Algorithmen aufgrund von Musl LIBC, insbesondere Bcrypt, unvollständig.

Dies bedeutet, dass ein Skript, das mit der $ 2y $ $ Prefix -Verschlüsselung auf Ubuntu gut ausgeführt wird, direkt *0 oder *1 (Anzeichen für den Fehler) im Alpine -Container oder eine Hash -Zeichenfolge im falschen Format zurückgeben kann.

2. Das Format des Verschlüsselungsergebnisses kann unterschiedlich sein

In einigen Systemen, selbst wenn der gleiche Algorithmus unterstützt wird, können die zurückgegebenen Verschlüsselungsergebnisse leicht unterschiedliche Formate haben. Zum Beispiel:

 $hash1 = crypt('password', '$2y$10$1234567890123456789012'); // existieren Linux Vorgesetzter
$hash2 = crypt('password', '$2y$10$1234567890123456789012'); // existieren macOS Vorgesetzter

Die $ Hash1 und $ Hash2 in den beiden oben genannten Codezeilen können unterschiedlich sein, und selbst die Leistung verschiedener Versionen des Systems wird unterschiedlich sein. Dies ist ein potenzielles Risiko für eine plattformübergreifende Bereitstellung.

3. Standardverhalten ist inkonsistent

Wenn kein geeigneter Salzwert bereitgestellt wird, wird das Verhalten von Crypt () vom System bestimmt, der kann:

  • Mit traditionellem DES

  • Verwenden Sie standardmäßig einen Hash -Algorithmus

  • Versäumte es, direkt zurückzukehren

Dies bedeutet, dass das Verhalten des Programms ausschließlich von der Systemimplementierung abhängt und äußerst unzuverlässig ist, wenn der Algorithmus und der Salzwert nicht explizit angegeben sind.

3. Reales Fallanalyse

Ein Entwickler hat einst Crypt () im Laravel -Framework verwendet, um Benutzerkennwörter manuell zu verschlüsseln und in der Datenbank zu speichern. Der Code wird normalerweise in der lokalen Ubuntu -Entwicklungsumgebung ausgeführt. Nachdem die Benutzeranmeldung jedoch für einen alpine basierten Docker-Container bereitgestellt wurde, schlägt der Benutzeranmeldung immer fehl. Der Grund dafür ist, dass Crypt () in Alpine nicht den $ 2y $ $ Bcrypt -Algorithmus unterstützt, was dazu führt, dass der generierte Hash illegal ist.

4. Wie kann man Verschlüsselungsfunktionen sicher und zuverlässig verwenden?

Um diese Kompatibilitäts- und Portabilitätsprobleme zu vermeiden, wird empfohlen:

1. Verwenden Sie Passage_hash () und password_verify () in PHP

Diese Funktionen wurden seit PHP 5.5 eingeführt und sind besser in der zugrunde liegenden Implementierung eingekapselt, ohne sich auf das Verhalten des Systems des Systems zu verlassen. Beispielcode:

 $hash = password_hash('mypassword', PASSWORD_BCRYPT);
if (password_verify('mypassword', $hash)) {
    echo 'Richtiges Passwort';
}

Diese Methode unterstützt nicht nur die automatische Auswahl des optimalen Algorithmus, sondern behandelt auch Verschlüsselungsparameter (z. B. Kosten), was derzeit die am meisten empfohlene Praxis ist.

2. Wenn Crypt () verwendet werden muss, muss der Algorithmus und der Salzwert explizit angegeben werden.

Und stellen Sie sicher, dass die Zielumgebung den Algorithmus beispielsweise unterstützt:

 $salt = '$2y$10$' . substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);
$hash = crypt('mypassword', $salt);

Stellen Sie sicher, dass Sie den Erzeugungs- und Überprüfungsprozess auf dem Zielserver vor der Bereitstellung testen, um Umgebungsunterschiede zu vermeiden.

3. Vermeiden Sie es, die Verschlüsselungslogik in den Code zu schreiben

Erwägen Sie, Konfigurationsdateien oder Umgebungsvariablen zur Steuerung der Verschlüsselungsrichtlinien zu verwenden, die die Anpassung der Richtlinien in verschiedenen Umgebungen erleichtert.

5. Zusammenfassung

Obwohl Crypt () in PHP schon lange gibt, macht es seine Plattformabhängigkeit zu einer weniger zuverlässigen Option, insbesondere wenn die plattformübergreifende Bereitstellung in modernen Anwendungen die Norm ist. Die "Grube" mit Crypt () ist tatsächlich eine Manifestation der Kompatibilität zwischen Systemen. Die beste Lösung besteht darin, modernere und stabilere APIs wie password_hash () zu verwenden.

Wenn Sie immer noch ein altes System aufrechterhalten oder CryPT () mit besonderen Bedürfnissen verwenden, testen Sie und überprüfen Sie jedes Detail, um sicherzustellen, dass alle Betriebsumgebungen den Verschlüsselungsalgorithmus konsequent unterstützen, da sonst möglicherweise die "große Grube" der Sicherheit oder Funktionalität eingehen.

Für ein weiteres Debuggen können Sie zugreifen:

https://m66.net/crypt-debug-tool (vorausgesetzt, die Tool-Seite wird bereitgestellt)

Lassen Sie kein anderes Verschlüsselungsverhalten in den Systemen zu einer "Zeitbombe" in Ihrem Projekt werden.