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

Comment puis-je chiffrer et décrypter en toute sécurité des chaînes en PHP à l'aide de bibliothèques établies ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-17 10:06:241050parcourir

How Can I Securely Encrypt and Decrypt Strings in PHP Using Established Libraries?

Cryptage et déchiffrement de chaînes en PHP

Éviter les pièges courants

Avant de se plonger dans l'implémentation du cryptage et du déchiffrement, il est crucial de comprendre la différence entre le cryptage et l'authentification. Pour une protection sécurisée des données, le cryptage authentifié est recommandé plutôt que le cryptage simple. De plus, il est conseillé d'éviter de créer des implémentations de cryptographie personnalisées et de s'appuyer plutôt sur des bibliothèques sécurisées et bien établies comme libsodium ou defuse/php-encryption.

Cryptage et décryptage

Cryptage :

  1. Crypter les données à l'aide AES-CTR ou GCM (recommandé).
  2. Authentifier le texte chiffré à l'aide de HMAC-SHA-256 (ou Poly1305 pour les chiffrements par flux).

Déchiffrement :

  1. Vérifiez le MAC du texte chiffré (si vous n'utilisez pas Poly1305 ou GCM).
  2. Déchiffrer le message.

Mise en œuvre avec Libsodium

use Sodium\Crypto\SecretBox;

$key = random_bytes(SecretBox::KEYBYTES);
$nonce = random_bytes(SecretBox::NONCEBYTES);

$ciphertext = SecretBox::encrypt($message, $nonce, $key);
$plaintext = SecretBox::decrypt($ciphertext, $nonce, $key);

Mise en œuvre avec defuse/php-encryption

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

$key = Key::createNewRandomKey();

$ciphertext = Crypto::encrypt($message, $key);
$plaintext = Crypto::decrypt($ciphertext, $key);

Considérations supplémentaires

  • Évitez de compresser les données avant le chiffrement.
  • Utilisez des fonctions sécurisées telles que mb_strlen() et mb_substr() pour la manipulation de chaînes.
  • Générer des IV en utilisant un CSPRNG (par exemple, random_bytes()).
  • Évitez d'utiliser des fonctions telles que bin2hex() ou base64_encode() pour des fuites d'informations potentielles.
  • Authentifiez toujours le texte chiffré (MAC) après cryptage.

Précautions

  • Ne cryptez pas les mots de passe ; utilisez plutôt des algorithmes de hachage de mot de passe.
  • Ne cryptez pas les paramètres d'URL ; ce n'est pas la solution appropriée.

Exemple avec Libsodium

use Sodium\Crypto\SecretBox;

$key = random_bytes(SecretBox::KEYBYTES);
$nonce = random_bytes(SecretBox::NONCEBYTES);

$ciphertext = SecretBox::encrypt($message, $nonce, $key);
$plaintext = SecretBox::decrypt($ciphertext, $nonce, $key);

echo "Ciphertext: " . $ciphertext . PHP_EOL;
echo "Plaintext: " . $plaintext . PHP_EOL;

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!

Déclaration:
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