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

Comment chiffrer et décrypter en toute sécurité des chaînes PHP à l'aide de libsodium ?

Patricia Arquette
Libérer: 2024-12-18 03:00:10
original
920 Les gens l'ont consulté

How to Securely Encrypt and Decrypt PHP Strings Using libsodium?

Comment chiffrer et décrypter une chaîne PHP

Lorsque l'on parle de chiffrement, il est important de faire la distinction entre le chiffrement et l'authentification. En général, le chiffrement authentifié, qui combine le chiffrement avec le code d'authentification de message (MAC), est préféré. Pour garantir la sécurité, il est fortement recommandé d'éviter d'implémenter votre propre cryptographie et de s'appuyer plutôt sur des bibliothèques bien établies développées et examinées par des experts en cryptographie.

Étapes de cryptage à l'aide de libsodium :

  1. Cryptez le message en utilisant AES en mode CTR ou utilisez GCM, qui gère l'authentification implicitement.
  2. Authentifiez le texte chiffré à l'aide de HMAC-SHA-256, en vous assurant que le MAC couvre à la fois le IV et le texte chiffré.

Étapes de décryptage à l'aide de libsodium :

  1. Vérifiez le MAC du texte chiffré par rapport au MAC reçu. Abandonnez si la vérification échoue, indiquant une corruption des données.
  2. Déchiffrez le message à l'aide de la méthode de cryptage authentifiée.

Considérations supplémentaires :

  • Évitez de compresser quoi que ce soit avant le cryptage.
  • Utilisez les fonctions de manipulation de chaîne appropriées qui gèrent les caractères étendus ensembles.
  • Générez des IV en toute sécurité à l'aide d'un générateur de nombres pseudo-aléatoires cryptographiquement sécurisé (CSPRNG).
  • Effectuez toujours le cryptage avant MAC pour éviter les vulnérabilités.
  • Soyez conscient des problèmes potentiels de fuite d'informations. avec certaines méthodes d'encodage.

Exemple de code avec 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;
}
?>
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