Maison > développement back-end > tutoriel php > Comment chiffrer et décrypter en toute sécurité des chaînes PHP à l'aide de Libsodium ou defuse/php-encryption ?

Comment chiffrer et décrypter en toute sécurité des chaînes PHP à l'aide de Libsodium ou defuse/php-encryption ?

Mary-Kate Olsen
Libérer: 2024-12-18 00:26:10
original
123 Les gens l'ont consulté

How to Securely Encrypt and Decrypt PHP Strings Using Libsodium or defuse/php-encryption?

Cryptage et déchiffrement des chaînes PHP

Question :
Comment pouvons-nous chiffrer et décrypter une chaîne PHP, nécessitant à la fois une chaîne originale et un sel ou une clé pour les deux processus ?

Réponse :
Il est crucial de comprendre la différence entre le cryptage et l'authentification avant de continuer. Pour une sécurité renforcée, nous recommandons l'authentification cryptée, qui implique le cryptage puis l'authentification.

Évitez de créer votre propre cryptographie ; utilisez plutôt une bibliothèque fiable développée par des spécialistes de la cryptographie. Nous vous conseillons fortement d'utiliser libsodium ou defuse/php-encryption en raison de leur facilité d'utilisation et de leur cryptage authentifié intégré.

Étapes de cryptage :

  1. Utiliser AES en mode CTR pour le cryptage.
  2. Authentifier le texte chiffré à l'aide de HMAC-SHA-256 (ou Poly1305).

Étapes de décryptage :

  1. Recalculez le MAC du texte chiffré et comparez-le avec le MAC d'origine. Abandonnez en cas de non-concordance.
  2. Procédez au déchiffrement.

Considérations de conception :

  1. Évitez de compresser le texte chiffré.
  2. Employez mb_strlen() et mb_substr() avec le Mode de jeu de caractères « 8 bits ».
  3. Utilisez un CSPRNG pour générer des IV. Évitez MCRYPT_RAND.
  4. Toujours chiffrer avant de vous authentifier (sauf si vous utilisez AEAD).
  5. Soyez conscient des vulnérabilités de synchronisation du cache.

Quand ne pas utiliser le chiffrement :

  • Stockage des mots de passe (utiliser des algorithmes de hachage de mots de passe comme Argon2 à la place)
  • Cryptage des paramètres d'URL (outil inapproprié)

Exemple PHP Libsodium :

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
        )
    );
    return $cipher;
}
Copier après la connexion

Libsodium Décryptage :

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
    );
    return $plain;
}
Copier après la connexion

defuse/php-encryption Exemple :

use Defuse\Crypto\Crypto;
use Defuse\Crypto\Key;

$message = 'We are all living in a yellow submarine';
$key = Key::createNewRandomKey();
$ciphertext = Crypto::encrypt($message, $key);
$plaintext = Crypto::decrypt($ciphertext, $key);
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal