>  기사  >  백엔드 개발  >  PHP mcrypt 암호화 확장이란 무엇입니까? mcrypt 확장에 대한 자세한 소개

PHP mcrypt 암호화 확장이란 무엇입니까? mcrypt 확장에 대한 자세한 소개

不言
不言원래의
2018-07-24 17:38:042220검색

특정 프로젝트 개발에서는 때로는 프런트엔드 및 백엔드 상호 작용 중에 특정 데이터를 암호화해야 할 수도 있습니다. 따라서 PHP는 데이터 암호화 및 해독을 구현하기 위해 mcrypt 암호화 확장을 제공합니다. 다음으로 mcrypt 확장 기능 소개에 대해 자세히 살펴보겠습니다.

1. mcrypt 확장 설치

  PHP 하위 버전에서는 구성 파일 php.ini에 확장에 대한 참조를 명시적으로 추가하고 해당 확장 파일이 있는지 확인해야 합니다. 확장 참조 디렉터리. PHP의 상위 버전에서는 Windows에서 mcrypt 확장이 기본적으로 활성화되어 있는 것으로 보입니다. 구성 파일 php.ini에서 이를 구성할 필요가 없으며 확장 참조에 해당 확장 파일이 없습니다. 디렉토리입니다. Linux에서는 해당 mcrypt.so 확장을 설치해야 합니다.

mcrypt 확장은 여러 암호화 알고리즘 및 모드를 지원합니다. mcrypt_list_algorithms() 및 mcrypt_list_modes()를 사용하여 지원되는 암호화 알고리즘 및 암호화 모드를 표시할 수 있습니다.

II. mcrypt 확장 프로그램

암호화 사용

1, 공개 암호화 알고리즘 및 모드

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

첫 번째 매개변수는 사용된 암호화 알고리즘의 이름으로, mcrypt_list_algorithms()에서 출력한 암호화 알고리즘에 해당합니다. 세 번째 각 매개변수는 암호화 모드에 해당하며 mcrypt_list_modes()에서 출력된 지원 암호화 모드에 해당합니다.

2, 초기화 벡터 생성

mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

PS에서는 두 번째 매개변수가 고정되어 있습니다. MCRY를 사용하세요. PT_RAND

3. 암호화 버퍼 초기화

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

$td는 반환된 암호화 설명자, $key는 암호화 키, $iv는 초기화입니다. 벡터

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";
?>

三、实现一个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);
    }
}

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

二、mcrypt扩展的使用

암호화

1, 공개 암호화 알고리즘 및 모드

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

먼저 첫 번째 매개변수는 사용된 암호화 알고리즘의 이름으로, mcrypt_list_algorithms()의 암호화 알고리즘 출력에 해당합니다. 세 번째 매개변수는 암호화 모드에 해당하며, mcrypt_list_modes()의 지원되는 암호화 모드 출력에 해당합니다.

2, 초기화 벡터 생성

mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

PS에서는 두 번째 매개변수가 고정되어 있습니다. MCRY를 사용하세요. PT_RAND

3. 암호화 버퍼 초기화

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

$td는 반환된 암호화 설명자, $key는 암호화 키, $iv는 초기화입니다. 벡터

4, data 암호화

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

$td는 암호화 설명자, $data는 암호화 전 데이터, data 암호화 함수는 암호화된 문자열을 반환합니다.加5,

암호화 종료, 정리 작업 실행

mcrypt_gneric_deinit ($ td);

1 복호화 버퍼 초기화

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

4. 데이터 복호화

$decrypted_data = mdecrypt_generic($td, $encrypt ed_data);

PS.$encrypted_data는 복호화 전의 암호문이고, $decrypted_data는 복호화 후의 평문입니다. 관련 추천:

PHP 암호화 확장 프로그램 mcrypt 사용 요약

위 내용은 PHP mcrypt 암호화 확장이란 무엇입니까? mcrypt 확장에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.