Maison >développement back-end >tutoriel php >Comment puis-je implémenter un cryptage et une authentification bidirectionnels simples en PHP ?

Comment puis-je implémenter un cryptage et une authentification bidirectionnels simples en PHP ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-24 02:10:13252parcourir

How Can I Implement Simple Two-Way Encryption and Authentication in PHP?

Cryptage bidirectionnel le plus simple à l'aide de PHP

Contexte

Attention : Évitez de chiffrer les mots de passe en utilisant ces méthodes ; utilisez plutôt des algorithmes de hachage de mot de passe pour un stockage sécurisé des mots de passe.

Cryptage de données portable en PHP

Lorsque vous utilisez PHP 5.4 ou version ultérieure et que vous souhaitez la portabilité du code, utilisez une bibliothèque existante fournissant un cryptage authentifié. Les méthodes Openssl, telles que openssl_encrypt() et openssl_decrypt(), peuvent être utilisées une fois que vous avez sélectionné une méthode de cryptage.

Cryptage et décryptage

Envisagez d'utiliser la norme de cryptage avancée (AES) dans Mode CTR pour le cryptage. Cette méthode offre le meilleur équilibre entre sécurité et performances. Consultez openssl_get_cipher_methods() pour une liste des méthodes prises en charge.

Wrapper de cryptage/décryptage simple utilisant OpenSSL

La classe PHP suivante fournit un wrapper de cryptage/déchiffrement simple utilisant OpenSSL :

class UnsafeCrypto
{
    const METHOD = 'aes-256-ctr';

    public static function encrypt($message, $key, $encode = false)
    {
        // ...
        if ($encode) {
            return base64_encode($nonce.$ciphertext);
        }
        return $nonce.$ciphertext;
    }

    public static function decrypt($message, $key, $encoded = false)
    {
        // ...
        $plaintext = openssl_decrypt(
            $ciphertext,
            self::METHOD,
            $key,
            OPENSSL_RAW_DATA,
            $nonce
        );
        
        return $plaintext;
    }
}

Simple Authentication Wrapper

Pour une sécurité renforcée, implémentez l'authentification pour vérifier l'intégrité des données cryptées :

class SaferCrypto extends UnsafeCrypto
{
    const HASH_ALGO = 'sha256';

    public static function encrypt($message, $key, $encode = false)
    {
        // ...
        if ($encode) {
            return base64_encode($mac.$ciphertext);
        }
        // Prepend MAC to the ciphertext and return to caller
        return $mac.$ciphertext;
    }

    public static function decrypt($message, $key, $encoded = false)
    {
        // ...
        $calculated = hash_hmac(
            self::HASH_ALGO,
            $ciphertext,
            $authKey,
            true
        );
        
        if (!self::hashEquals($mac, $calculated)) {
            throw new Exception('Encryption failure');
        }
        
        // Pass to UnsafeCrypto::decrypt
        $plaintext = parent::decrypt($ciphertext, $encKey);
        
        return $plaintext;
    }
}

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