PHP使用AES加密和解密

PHP使用AES对数据进行加密和解密

      最近因为业务需求,需要使用加密数据进行接口请求,从而可以保证数据安全,起码不会那么明显,最终博主查找资料后,采用了AES加密,下面就是分享整个加密解密的流程,首页是自己封装的一个类库,代码如下:

namespace ClassPHP\Aes;

class Aes
{
    /**
     * var string $method 加解密方法,可通过openssl_get_cipher_methods()获得
     */
    protected $method;

    /**
     * var string $secret_key 加解密的密钥
     */
    protected $secret_key;

    /**
     * var string $iv 加解密的向量,有些方法需要设置比如CBC
     */
    protected $iv;

    /**
     * var string $options (不知道怎么解释,目前设置为0没什么问题)
     */
    protected $options;

    /**
     * 构造函数
     *
     * @param string $key 密钥
     * @param string $method 加密方式
     * @param string $iv iv向量
     * @param mixed $options 还不是很清楚
     *
     */
    public function __construct($key, $method = 'AES-128-ECB', $iv = '', $options = 0)
    {
        // key是必须要设置的
        $this->secret_key = isset($key) ? $key : 'morefun';

        $this->method = $method;

        $this->iv = $iv;

        $this->options = $options;
    }

    /**
     * 加密方法,对数据进行加密,返回加密后的数据
     *
     * @param string $data 要加密的数据
     *
     * @return string
     *
     */
    public function encrypt($data)
    {
        return openssl_encrypt($data, $this->method, $this->secret_key, $this->options, 
        $this->iv);
    }

    /**
     * 解密方法,对数据进行解密,返回解密后的数据
     *
     * @param string $data 要解密的数据
     *
     * @return string
     *
     */
    public function decrypt($data)
    {
        return openssl_decrypt($data, $this->method, $this->secret_key, $this->options, 
        $this->iv);
    }
}

      然后就是我们写的一个公共配置文件,专门用来进行加解密的,代码如下:

#引入加密类库
require 'ClassPHP/Aes.php';
use ClassPHP\Aes\Aes;


/**
 * 解密数据
 * @param $data
 * @return mixed|string
 */
function decryptData($data)
{
    #密钥信息
    $key = "16位密钥";    //密钥
    $iv = "16位偏移量";   //偏移量
    #初始化类
    $aes = new Aes($key, 'AES-128-CBC', $iv);
    //解密
    $decrypted = $aes->decrypt($data);
    //判断是否为空
    if (empty($decrypted)) {
        return "";
    }
    //json转数组
    $result = json_decode($decrypted, true);
    //返回
    return $result;

}


/**
 * 加密数据
 * @param $data
 * @return mixed
 */
function encryptData($data)
{
    #密钥信息
    $key = "16位密钥";    //密钥
    $iv = "16位偏移量";   //偏移量
    #初始化类
    $aes = new Aes($key, 'AES-128-CBC', $iv);
    $encrypted = $aes->encrypt($data);
    return $encrypted;
}

       下面是我们的业务引用逻辑,代码如下:

#引入公告配置
require __DIR__ . "/aseComm.php";

#获取用户加密数据
$request = $_POST["request"];
if (!isset($request) || empty($request)) {
    echo "参数获取失败";
    exit();
}
#解密数据
$requestParams = decryptData($request);
#判断是否正确
if (!isset($requestParams["uid"])) {
    echo "非法请求";
    exit();
}
#处理逻辑

       这样我们就实现了前端传过来的数据进行解密,并处理逻辑,这样可以防止恶意调我们的接口,或者请求参数暴露在外面。

0条评论

发表评论