Qu'est-ce que l'extension de chiffrement PHP mcrypt ? Introduction détaillée à l'extension mcrypt

不言
Libérer: 2023-04-03 11:56:01
original
2219 Les gens l'ont consulté

Dans le développement de projets spécifiques, nous pouvons parfois avoir besoin de chiffrer certaines données lors des interactions front-end et back-end. Par conséquent PHP fournit l'extension de chiffrement mcrypt pour implémenter le chiffrement et le déchiffrement des données. Examinons ensuite en détail l’introduction de l’extension mcrypt.

1. Installation de extension mcrypt

 Dans les versions inférieures de PHP, elle doit être dans le fichier de configuration. php.ini Ajoutez explicitement une référence à l'extension et assurez-vous qu'il existe un fichier d'extension correspondant dans le répertoire de référence de l'extension ; dans les versions supérieures de PHP, l'extension mcrypt semble être activée par défaut sous Windows, et il n'est pas nécessaire de le faire. configurez-le dans le fichier de configuration php.ini , le fichier d'extension correspondant n'est pas visible dans le répertoire de référence de l'extension. Sous Linux, l'extension mcrypt.so correspondante doit être installée.

L'extension mcrypt prend en charge plusieurs algorithmes et modes de cryptage. Vous pouvez utiliser mcrypt_list_algorithms() et mcrypt_list_modes() pour afficher les algorithmes et modes de cryptage pris en charge.

II. Utilisation de l'extension mcrypt

Cryptage

1. Algorithme et mode de chiffrement ouverts

mcrypt_module_open('tripledes', '', ecb'', '') ;

Le premier paramètre est le nom de l'algorithme de chiffrement utilisé, correspondant à l'algorithme de chiffrement sorti par mcrypt_list_algorithms(); , correspondant Modes de chiffrement pris en charge affichés par mcrypt_list_modes().

2, Créer un vecteur d'initialisation

mcrypt_create_iv (mcrypt_enc_get_iv_size($td ), MCRYPT_RAND);

PS. Sous la plateforme Windows, le deuxième paramètre est fixé pour utiliser MCRYPT_RAND

3, Initialiser le tampon de chiffrement

mcrypt_generic_init($td, $key, $iv);

$td est Le descripteur de chiffrement renvoyé, $key est la clé de chiffrement, $iv est le vecteur d'initialisation

4、数据加密

   $encrypted_data = mcrypt_generic($td, $data);

   $td为加密描述符,$data为加密前的数据,数据加密函数返回加密后的字符串。

5、结束加密,执行清理工作

mcrypt_generic_deinit($td);

解密

1、打开解密算法和模式,同上,得到$td解密描述符

2、创建初始化向量,同上,得到$iv初始化向量

3、初始化解密缓冲区

mcrypt_generic_init($td,$key, $iv);

4、数据解密

   $decrypted_data = mdecrypt_generic($td, $encrypted_data);

PS.$encrypted_data为解密前的密文,$decrypted_data为解密后的明文。

演示Demo:

<?php
    /* 打开加密算法和模式 */
    $td = mcrypt_module_open(&#39;rijndael-256&#39;, &#39;&#39;, &#39;ofb&#39;, &#39;&#39;);

    /* 创建初始向量,并且检测密钥长度。 
     * Windows 平台请使用 MCRYPT_RAND。 */
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
    $ks = mcrypt_enc_get_key_size($td);

    /* 创建密钥 */
    $key = substr(md5(&#39;very secret key&#39;), 0, $ks);

    /* 初始化加密 */
    mcrypt_generic_init($td, $key, $iv);

    /* 加密数据 */
    $encrypted = mcrypt_generic($td, &#39;This is very important data&#39;);

    /* 结束加密,执行清理工作 */
    mcrypt_generic_deinit($td);

    /* 初始化解密模块 */
    mcrypt_generic_init($td, $key, $iv);

    /* 解密数据 */
    $decrypted = mdecrypt_generic($td, $encrypted);

    /* 结束解密,执行清理工作,并且关闭模块 */
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

    /* 显示文本 */
    echo trim($decrypted) . "\n";
?>
Copier après la connexion

三、实现一个AES加密类

<?php
/**
 * PHP AES加密解密类
 * Created by PhpStorm.
 * User: ahao
 * Date: 2016/11/3
 * Time: 0:03
 */
class PubEncrypt{
    public static $key = &#39;123454536f667445454d537973576562&#39;;  // 默认的key

    /**
     * AES加密
     * @param $data  明文
     * @param null $key  加密密钥
     * @return array|string
     */
    public static function AesEncrypt($data, $key = null){
        $data = trim($data);
        if($data == &#39;&#39;) return &#39;&#39;;
        try{
            if(!extension_loaded(&#39;mcrypt&#39;))
                throw new Exception(&#39;当前PHP环境没有加载mcrypt扩展&#39;);

            // 打开加密算法和模式
            $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;);

            $key = self::substr($key == null ? self::$key : $key, 0, mcrypt_enc_get_key_size($module));
            $iv = substr(md5($key), 0, mcrypt_enc_get_iv_size($module));

            // 初始化加密
            mcrypt_generic_init($module, $key, $iv);

            // 加密数据
            $encrypt = mcrypt_generic($module, $data);

            // 反初始化释放资源
            mcrypt_generic_deinit($module);

            // 关闭资源对象退出
            mcrypt_module_close($module);
            return array(&#39;status&#39; => true, &#39;data&#39; => base64_encode($encrypt));
        }catch (Exception $e){
            $error = $e->getMessage();
            $data = array(
                &#39;status&#39; => false,
                &#39;msg&#39; => $error
            );
            return $data;
        }
    }

    /**
     * AES解密
     * @param $encrypted  密文
     * @param null $key  解密密钥
     * @return array|string
     */
    public static function AesDecrypt($encrypted, $key = null){
        $encrypted = trim($encrypted);
        if($encrypted == &#39;&#39;)  return &#39;&#39;;
        try{
            if(!extension_loaded(&#39;mcrypt&#39;))
                throw new Exception(&#39;当前PHP环境没有加载mcrypt扩展&#39;);

            $encrypted = base64_decode($encrypted);
            $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;);

            $key = self::substr($key == null ? self::$key : $key, 0, mcrypt_enc_get_key_size($module));
            $iv = substr(md5($key), 0, mcrypt_enc_get_iv_size($module));

            mcrypt_generic_init($module, $key, $iv);
            $decrypted = mdecrypt_generic($module, $encrypted);
            mcrypt_generic_deinit($module);
            mcrypt_module_close($module);
            return array(&#39;status&#39; => true, &#39;data&#39; => rtrim($decrypted,"\0"));
        }catch (Exception $e){
            $error = $e->getMessage();
            $data = array(
                &#39;status&#39; => false,
                &#39;msg&#39; => $error
            );
            return $data;
        }
    }


    /**
     * 截取字符串
     * @param $string  被截取的字符串
     * @param $start   起始位置
     * @param $length  截取长度
     * @return string  截取到的字符串
     */
    private static function substr($string, $start, $length)
    {
        return extension_loaded(&#39;mbstring&#39;) ? mb_substr($string,$start,$length,&#39;8bit&#39;) : substr($string,$start,$length);
    }
}
Copier après la connexion

PS.使用数据加密的好处:数据在前后台之间进行传输的是一个加密后的字符串,可以防止数据被爬虫抓包,避免敏感数据的泄露,也可以有效防止猜测出数据项对数据操作接口进行恶意请求

二、mcrypt扩展的使用

Cryptage

1 Algorithme et mode de cryptage ouverts

mcrypt_module_open('tripledes', '', ecb'', '');

Le premier paramètre est d'utiliser Le nom de l'algorithme de chiffrement correspond à l'algorithme de chiffrement sorti par mcrypt_list_algorithms(); le troisième paramètre correspond au mode de chiffrement, qui correspond au mode de chiffrement pris en charge sorti par mcrypt_list_modes().

2, Créer un vecteur d'initialisation

mcrypt_create_iv (mcrypt_enc_get_iv_size($td ), MCRYPT_RAND);

PS. Sous la plateforme Windows, le deuxième paramètre est fixé pour utiliser MCRYPT_RAND

3, Initialiser le tampon de chiffrement

mcrypt_generic_init($td, $key, $iv);

$td est Le descripteur de chiffrement renvoyé, $key est la clé de chiffrement, $iv est le vecteur d'initialisation

4, Cryptage des données

$encrypted_data = mcrypt_generic($td, $data);

$td est le descripteur de cryptage, $data est les données avant cryptage, fonction de cryptage des données Renvoie la chaîne chiffrée.

5. Terminez le cryptage et effectuez le travail de nettoyage

mcrypt_generic_deinit ($ td);

Décryptage

1, Ouvrez l'algorithme et le mode de décryptage, comme ci-dessus, obtenez le descripteur de décryptage $td

2, Créez un vecteur d'initialisation, comme ci-dessus, obtenez un Vecteur d'initialisation $iv

3, Initialiser le tampon de décryptage

mcrypt_generic_init($td,$key, $iv);

4. 🎜>

$decrypted_data = mdecrypt_generic($td, $encrypted_data);

PS.$encrypted_data est le texte chiffré avant le décryptage, $decrypted_data est le texte en clair après le décryptage.

Recommandations associées :

Résumé de l'utilisation de l'extension de chiffrement php mcrypt

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!

Étiquettes associées:
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal