In PHP wird die Crypt () -Funktion verwendet, um Strings in Einweg-Hashing zu verschlüsseln, die häufig zum Speichern und Überprüfen von Kennwörtern verwendet wird. Obwohl seine Verwendung auf verschiedenen Plattformen ungefähr gleich ist, unterscheiden sich die von Crypt () zurückgegebenen Ergebnisse in verschiedenen Betriebssystemen, insbesondere in Windows und Linux, häufig. Dieser Unterschied verwirrt viele Entwickler. Dieser Artikel wird die ausführlichen Gründe analysieren und Lösungen angeben.
Crypt () ist eine Schnittstellenfunktion, und die zugrunde liegende Implementierung hängt vom Verschlüsselungsalgorithmus ab, das vom Betriebssystem bereitgestellt wird. Es unterstützt normalerweise eine Vielzahl von Verschlüsselungsalgorithmen, einschließlich DES, MD5, SHA-256, SHA-512 usw. Die spezifische Unterstützung hängt vom Betriebssystem und der PHP-Version ab.
Aufrufformat Beispiel:
$hash = crypt('mypassword', '$6$rounds=5000$usesomesillystringforsalt$');
Der zweite Parameter hier ist Salz, das den Verschlüsselungsalgorithmus und die Verschlüsselungsstärke bestimmt.
Linux verwendet normalerweise die Crypt () -implementierung basierend auf GLIBC (GNU C-Bibliothek) und unterstützt eine Vielzahl moderner Hashing-Algorithmen (wie SHA-256, SHA-512 usw.).
Windows hat keine integrierte Crypt () -implementierung. PHP verwendet eine relativ grundlegende Implementierung unter Windows, die normalerweise nur herkömmliche DES- oder MD5 -Algorithmen unterstützt und relativ begrenzte Verschlüsselungsmethoden aufweist.
Dies führt dazu, dass der entsprechende Hash korrekt erzeugt wird, wenn SHA-512-Salzparameter unter Linux verwendet werden, während Windows dieses Salzformat möglicherweise nicht erkennen und das Rückgabeergebnis unterschiedlich sein wird.
Unterschiedliche PHP -Versionen können die Unterstützung von Crypt () optimieren und ergänzen, aber die zugrunde liegende Schicht hängt immer noch von der Systembibliothek ab. PHP unter Windows kann normalerweise nur auf interne Implementierungen beruhen, sodass seine Leistung nicht so umfassend ist wie Linux.
Linux unterstützt reichhaltigere Salzformate, wie z. B.:
$ 1 $ bedeutet MD5
$ 5 $ bedeutet SHA-256
$ 6 $ bedeutet SHA-512
Windows erkennen möglicherweise nur einfache Formate wie $ 1 $ und komplexe Formate werden ignoriert, was zu unterschiedlichen Hash -Ergebnissen führt.
PHP 5.5 führte später eine modernere und einheitlichere Passwort -Hash -Schnittstelle ein:
$hash = password_hash('mypassword', PASSWORD_DEFAULT);
if (password_verify('mypassword', $hash)) {
echo "Passwortüberprüfung erfolgreich";
}
Es ist intern zusammengefügte kompatible Implementierungen zusammengefasst, wodurch das Problem des inkonsistenten Verhaltens von Crypt () auf verschiedenen Systemen vermieden wird.
Versuchen Sie, Standardschnittstellen zu verwenden, um Salz anstelle von manuellem Spleißen zu erzeugen. Manuelles Einstellen von Salz kann Kompatibilitäts- und Sicherheitsrisiken verursachen.
Wenn Sie CryPT () verwenden müssen, stellen Sie sicher, dass Sie Tests auf dem Zielsystem durchführen, um einen Verifizierungsfehler aufgrund von Hashing -Algorithmus -Unterschieden zu vermeiden.
<?php
// Empfohlene Verwendung password_hash Alternative crypt
$password = 'mypassword';
$hash = password_hash($password, PASSWORD_DEFAULT);
echo "Hash -Ergebnis:" . $hash . PHP_EOL;
// Passwort überprüfen
if (password_verify($password, $hash)) {
echo "Passwortüberprüfung erfolgreich";
} else {
echo "Passwortüberprüfung fehlgeschlagen";
}
?>
Diese Methode gewährleistet eine konsistente Leistung in Windows- und Linux -Umgebungen und verwendet einen sicheren Hashing -Algorithmus.