So verschlüsseln und entschlüsseln Sie einen PHP-String
Bei der Erörterung der Verschlüsselung ist es wichtig, zwischen Verschlüsselung und Authentifizierung zu unterscheiden. Typischerweise wird eine authentifizierte Verschlüsselung bevorzugt, die Verschlüsselung mit Nachrichtenauthentifizierungscode (MAC) kombiniert. Um die Sicherheit zu gewährleisten, wird dringend empfohlen, die Implementierung Ihrer eigenen Kryptografie zu vermeiden und sich stattdessen auf etablierte Bibliotheken zu verlassen, die von Kryptografieexperten entwickelt und überprüft wurden.
Verschlüsselungsschritte mit libsodium:
- Verschlüsseln Sie die Nachricht mit AES im CTR-Modus oder verwenden Sie GCM, das die Authentifizierung übernimmt implizit.
- Authentifizieren Sie den Chiffretext mit HMAC-SHA-256 und stellen Sie sicher, dass der MAC sowohl die IV als auch den Chiffretext abdeckt.
Entschlüsselungsschritte mit libsodium:
- Verifizieren Sie den MAC des Chiffretextes anhand des empfangenen MAC. Abbrechen, wenn die Überprüfung fehlschlägt, was auf eine Datenbeschädigung hinweist.
- Entschlüsseln Sie die Nachricht mit der authentifizierten Verschlüsselungsmethode.
Zusätzliche Überlegungen:
- Vermeiden Sie es, irgendetwas vor der Verschlüsselung zu komprimieren.
- Verwenden Sie geeignete String-Manipulationsfunktionen, die erweiterte Zeichen verarbeiten Sätze.
- Generieren Sie IVs sicher mit einem kryptografisch sicheren Pseudozufallszahlengenerator (CSPRNG).
- Führen Sie immer eine Verschlüsselung vor MAC durch, um Schwachstellen zu vermeiden.
- Seien Sie sich möglicher Probleme bei Informationslecks bewusst mit bestimmten Kodierungsmethoden.
Beispielcode mit libsodium:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <?php
declare (strict_types=1);
function safeEncrypt(string $message , string $key ): string
{
if (mb_strlen( $key , '8bit' ) !== SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
throw new RangeException( 'Key is not the correct size (must be 32 bytes).' );
}
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$cipher = base64_encode (
$nonce .
sodium_crypto_secretbox(
$message ,
$nonce ,
$key
)
);
sodium_memzero( $message );
sodium_memzero( $key );
return $cipher ;
}
function safeDecrypt(string $encrypted , string $key ): string
{
$decoded = base64_decode ( $encrypted );
$nonce = mb_substr( $decoded , 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit' );
$ciphertext = mb_substr( $decoded , SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit' );
$plain = sodium_crypto_secretbox_open(
$ciphertext ,
$nonce ,
$key
);
if (! is_string ( $plain )) {
throw new Exception( 'Invalid MAC' );
}
sodium_memzero( $ciphertext );
sodium_memzero( $key );
return $plain ;
}
?>
|
Nach dem Login kopieren
Das obige ist der detaillierte Inhalt vonWie verschlüssele und entschlüssele ich PHP-Strings sicher mit libsodium?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!