PHP实现AES加密:现代标准与废弃mcrypt的对比

山海之间
山海之间
发布时间:2026-10-15| 4人浏览过
原创

AES(高级加密标准)是业界广泛使用的对称加密算法。在PHP开发历史中,mcrypt 扩展曾广泛用于实现AES加密,但该扩展因安全性维护停止已在 PHP 7.1+ 中被移除。本文将提供一份基于原生 openssl 扩展的现代 AES 加密类代码,并解析其使用方法和关键参数。

为什么需要更新加密方法

许多旧教程或遗留代码库中仍可见 mcrypt_encrypt 和 mcrypt_decrypt 函数。随着服务器环境的升级(如迁移至 PHP 7.2 或更高版本),继续使用这些函数会导致 fatal error。此外,mcrypt 存在一些设计缺陷,而 openssl 作为底层密码学库,提供了更规范、更安全且持续维护的功能支持。

准备条件与注意事项

  1. 环境检查:确保你的 PHP 版本支持 openssl 扩展(绝大多数现代 PHP 安装默认包含)。
  2. 密钥与IV长度:对于 AES-128,密钥长度必须严格为 16 字节;对于 AES-256,则为 32 字节。初始化向量(IV)长度固定为 16 字节。
  3. Base64处理:密文通常是二进制数据,传输或存储前通常需要使用 Base64 编码进行转换,以便以文本形式安全传递。
  4. 风险提醒:openssl 操作涉及敏感数据,请勿将密钥硬编码在可公开访问的代码文件中,建议使用环境变量或配置管理工具。

第1步:创建现代AES加密类

以下代码封装了 openssl_encrypt 和 openssl_decrypt 方法,实现了兼容常见需求的 AES-128-CBC 模式加密:

<?php
class AESOpenSSL {
    private $cipher = 'aes-128-cbc';
    private $key;
    private $iv;

    public function __construct($key, $iv) {
        // 确保Key和Iv长度正确
        if (strlen($key) !== 16 || strlen($iv) !== 16) {
            throw new Exception('Key must be 16 bytes and IV must be 16 bytes for AES-128.');
        }
        $this->key = $key;
        $this->iv = $iv;
    }

    public function encrypt($data) {
        $encrypted = openssl_encrypt(
            $data,
            $this->cipher,
            $this->key,
            OPENSSL_RAW_DATA,
            $this->iv
        );
        // 返回Base64编码后的字符串,便于网络传输或存入数据库
        return base64_encode($encrypted);
    }

    public function decrypt($data) {
        // 先进行Base64解码
        $decodedData = base64_decode($data);
        
        $decrypted = openssl_decrypt(
            $decodedData,
            $this->cipher,
            $this->key,
            OPENSSL_RAW_DATA,
            $this->iv
        );
        
        if ($decrypted === false) {
            throw new Exception('Decryption failed.');
        }
        
        return $decrypted;
    }
}
?>

第2步:执行加密与解密操作

在实际业务场景中,你可以按照以下方式调用上述类:

<?php
// 1. 定义密钥和初始向量(IV)。IV不需要保密,但必须唯一且随机。
$key = 'abcdef1234567890'; // 16字符
$iv  = '0987654321fedcba'; // 16字符

try {
    $aes = new AESOpenSSL($key, $iv);
    
    // 2. 明文数据
    $plainText = 'haowei.me';
    
    // 3. 执行加密
    $encryptedStr = $aes->encrypt($plainText);
    echo '加密后: ' . $encryptedStr . PHP_EOL;
    
    // 4. 执行解密
    $decryptedText = $aes->decrypt($encryptedStr);
    var_dump($decryptedText); // 输出字符串 'haowei.me'
    
} catch (Exception $e) {
    echo '错误: ' . $e->getMessage();
}
?>

总结

通过弃用老旧的 Mcrypt 并转向 OpenSSL,开发者可以获得更可靠的加密体验。上述 AES-128-CBC 方案简单易懂,适合大多数非金融级核心场景。若需更高安全性,建议进一步研究 AES-GCM 模式或引入专业的第三方密码学库。

以上就是PHP实现AES加密的正确与现代做法的详细内容,更多关于PHP加密技术的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。