PHP7.2中AES加密解密方法mcrypt_module_open替换方案
前言
php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移到PECL中。PHP手册在7.1迁移页面给出了替代方案,就是用OpenSSL取代MCrypt,如果是新项目,还是使用 openssl_decrypt 来代替 mcrypt_encrypt 来做双向加密解密吧
封装Aes加密解密类
我用的thinkphp5 ,所以是基于thinkphp框架做的封装
在thinkphpwu\application\common\lib 目录下创建Aes.php
<?php
namespace app\common\lib;
class Aes
{
private $key = null;
private $iv = null;
public function __construct()
{
// 需要小伙伴在配置文件app.php中定义aeskey
$this->iv = config('app.aesiv');
$this->key = config('app.aeskey');
$this->key = hash('sha256', $this->key, true);
}
public function encrypt($input)
{
$data = openssl_encrypt($input, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->iv));
$data = base64_encode($data);
return $data;
}
public function decrypt($input)
{
$decrypted = openssl_decrypt(base64_decode($input), 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->iv));
return $decrypted;
}
function hexToStr($hex)
{
$string = '';
for ($i = 0; $i < strlen($hex) - 1; $i += 2) {
$string .= chr(hexdec($hex[$i] . $hex[$i + 1]));
}
return $string;
}
}
在thinkphpwu\application\extra修改公共配置文件的key和iv的值
<?php
return [
'admin_password_pre' => '_qipa250',//后台管理员密码加密后缀
'aeskey' => 'QiPa250',//aes 密钥,服务端和客户端保持一致
'aesiv' => '12345678901234567890123456789012',//aes 密钥,服务端和客户端保持一致
];
测试加密解密
<?php
namespace app\api\controller;
use think\Controller;
use app\common\lib\exception\ApiException;
use app\common\lib\Aes;
/*
* api接口模块的公共控制器
*/
class Common extends Controller
{
public function _initialize()
{
$this->testAes();
}
public function testAes()
{
$str = 'name=奇葩天地网&url=www.qipa250.com';
$aes_str = (new Aes())->encrypt($str);
echo '加密' . $aes_str;
echo "\n";
echo '解密' . (new Aes())->decrypt($aes_str);
exit();
}
}