Heim >Backend-Entwicklung >PHP-Tutorial >Wie verschlüssele und entschlüssele ich PHP-Strings sicher mit libsodium?

Wie verschlüssele und entschlüssele ich PHP-Strings sicher mit libsodium?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-18 03:00:10921Durchsuche

How to Securely Encrypt and Decrypt PHP Strings Using libsodium?

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:

  1. Verschlüsseln Sie die Nachricht mit AES im CTR-Modus oder verwenden Sie GCM, das die Authentifizierung übernimmt implizit.
  2. 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:

  1. Verifizieren Sie den MAC des Chiffretextes anhand des empfangenen MAC. Abbrechen, wenn die Überprüfung fehlschlägt, was auf eine Datenbeschädigung hinweist.
  2. 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:

<?php
declare(strict_types=1);

/**
 * Encrypt a message
 * 
 * @param string $message - message to encrypt
 * @param string $key - encryption key
 * @return string
 * @throws RangeException
 */
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;
}

/**
 * Decrypt a message
 * 
 * @param string $encrypted - message encrypted with safeEncrypt()
 * @param string $key - encryption key
 * @return string
 * @throws Exception
 */
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;
}
?>

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn