Aktueller Standort: Startseite> Neueste Artikel> Was ist los mit dem Ergebnis in inkonsistenter Länge?

Was ist los mit dem Ergebnis in inkonsistenter Länge?

M66 2025-05-20

Bei Verwendung von PHP -Funktion von Crypt () für die Kennwortverschlüsselung bemerken viele Entwickler ein seltsames Phänomen: Manchmal beträgt die Länge des Verschlüsselungsergebnisses 13 Zeichen, manchmal 20, 34 oder sogar mehr. Diese Inkonsistenz in der Länge kann die Menschen leicht fälschlicherweise denken lassen, dass etwas mit dem Code nicht stimmt oder dass das Passwort falsch abgeschnitten oder falsch verschlüsselt wird. Was ist denn los?

1. Einführung in die KryPT () -Funktion

Die Crypt () -Funktion von PHP ist eine eingekapselte Verschlüsselungsschnittstelle, und die zugrunde liegende Schicht hängt vom vom Betriebssystem bereitgestellten Verschlüsselungsalgorithmus ab. Der erste Parameter dieser Funktion ist die zu verschlüssende Zeichenfolge und der zweite Parameter ist "Salz". Dieser Salzwert beeinflusst nicht nur die Einzigartigkeit des Verschlüsselungsergebnisses, sondern bestimmt auch, welcher Verschlüsselungsalgorithmus verwendet wird.

 echo crypt("mypassword", "salt");

Wenn Sie keine Salzwerte angeben oder ein falsches Format verwenden, greift PHP automatisch auf ältere Verschlüsselungsmethoden zurück, z.

2. Verschiedene Salzwerte repräsentieren verschiedene Verschlüsselungsalgorithmen

Die Crypt () -Funktion unterstützt mehrere Algorithmen, und verschiedene Algorithmen werden durch das Präfix des Salzwerts bestimmt. Hier sind mehrere gemeinsame Salzwertformate und ihre entsprechenden Verschlüsselungsalgorithmen:

Algorithmus Salzwertformat Ergebnislänge
Des 2 Zeichen 13 Zeichen
MD5 $ 1 $ ... 34 Zeichen
Blowfish $ 2a $ ... / $ 2y $ ... 60 Zeichen
SHA-256 $ 5 $ ... 43 Zeichen
SHA-512 $ 6 $ ... 86 Zeichen

Wenn Sie also keinen vorangestellten Salzwert explizit übergeben oder einen nicht formatierten Salzwert übergeben, wird PHP wahrscheinlich wieder in die alte Des-Verschlüsselung zurückkehren, die nur 13 Zeichen ausgibt.

Zum Beispiel:

 // verwenden SHA-512 Verschlüsselung
echo crypt("mypassword", '$6$rounds=5000$usesomesillystring$');
// Der Ausgang ist ähnlich wie:$6$rounds=5000$usesomesill...(Gesamtlänge ungefähr86)

Und der folgende Code verwendet den Standard des Algorithmus:

 echo crypt("mypassword", 'sa');
// Der Ausgang ist ähnlich wie:sahGDf/YwKdl6(nur13Charaktere)

3. Was soll ich tun?

Um dieses Problem zu vermeiden, verwenden Sie immer Salzwerte mit expliziten Präfixen, vorzugsweise die erzeugten zufälligen Salze, und wählen Sie sicherere Algorithmen wie Blowfish ( $ 2y $ ) oder SHA-512 ( $ 6 $ ).

Sie können automatisch Salzwerte wie folgt erstellen:

 function generateSalt($algo = 'sha512') {
    switch ($algo) {
        case 'blowfish':
            return '$2y$10$' . substr(str_replace('+', '.', base64_encode(random_bytes(22))), 0, 22);
        case 'sha256':
            return '$5$' . bin2hex(random_bytes(6));
        case 'sha512':
        default:
            return '$6$' . bin2hex(random_bytes(6));
    }
}

$password = 'mypassword';
$salt = generateSalt('sha512');
$hash = crypt($password, $salt);

echo $hash;

Iv. Ein vollständiges Beispiel

 <?php
function hashPassword($password) {
    $salt = '$2y$10$' . substr(str_replace('+', '.', base64_encode(random_bytes(22))), 0, 22);
    return crypt($password, $salt);
}

$plainPassword = '123456';
$hashed = hashPassword($plainPassword);

// Übernehmen Sie in der Datenbank gespeichert
file_put_contents('/var/www/m66.net/passwords.txt', $hashed . PHP_EOL);

// Passwort überprüfen
$inputPassword = '123456';
$isValid = crypt($inputPassword, $hashed) === $hashed;
echo $isValid ? 'Richtiges Passwort' : 'Fehlerkennwort';
?>

5. Zusammenfassung

Bei Verwendung der Crypt () -Funktion ist der grundlegende Grund für die unterschiedlichen Längen des Ergebnisses, dass das Format des "Salzwerts" den Verschlüsselungsalgorithmus bestimmt. Sicherstellung der Verschlüsselungssicherheit und -konsistenz:

  1. Immer explizit im richtigen Format Salzwert bestehen ;

  2. Wählen Sie moderne, sichere Algorithmen wie $ 2y $ oder $ 6 $ ;

  3. Verlassen Sie sich nicht auf Standardverhalten oder kurze Salzformate .

Nach dem Verständnis dieser zugrunde liegenden Details können Sie versteckte Sicherheitsrisiken in der Kennwortverarbeitung vermeiden und Ihre Verschlüsselungslogik steuerbarer und zuverlässiger machen.