PHP使用openssl扩展实现AES-256-CBC加密解密

林见深
林见深
发布时间:2026-10-13| 2人浏览过
原创

介绍了在PHP中使用openssl扩展实现AES-256-CBC加密与解密的完整代码示例,涵盖密钥管理、数据序列化、加密操作及结果还原的具体步骤。

AES-256-CBC加密方法

在PHP中实现加密功能时,通常需要结合 openssl_encrypt 函数。以下示例展示了如何将数据序列化后,使用指定的密钥($key)和初始化向量($iv)进行加密,并最终将结果编码为Base64格式字符串,便于存储或传输。

  1. 准备数据: 使用 serialize() 将原始数据(如数组或对象)转换为字符串。
  2. 生成 IV: AES-256-CBC 模式需要一个16字节的初始化向量。示例中从固定字符串截取前16位并转为 Base64 保存,以便解密时使用相同的 IV。
  3. 执行加密: 调用 openssl_encrypt(),算法指定为 'AES-256-CBC',选项设为 0(纯文本模式)。
  4. 封装结果: 将 IV 和加密后的密文组合成 JSON 对象,并对整个对象进行 Base64 编码。
function encrypt($id){
  // 1. 序列化数据
  $id = serialize($id);
  
  // 2. 定义密钥 (需为32字节用于AES-256)
  $key = "1112121212121212121212";
  
  // 3. 设置IV并获取其base64形式,用于后续解密
  // 注意:实际生产中建议随机生成IV并存储在密文中
  $data['iv'] = base64_encode(substr('fdakinel;injajdji', 0, 16));
  
  // 4. 使用openssl_encrypt进行加密
  $data['value'] = openssl_encrypt(
    $id, 
    'AES-256-CBC', 
    $key, 
    0, 
    base64_decode($data['iv'])
  );
  
  // 5. 将iv和密文转为json,再转base64返回
  $encrypt = base64_encode(json_encode($data));
  return $encrypt;
}

AES-256-CBC解密方法

解密是加密过程的逆向操作。需要提取存储的 IV 和密文,使用相同的密钥和解密算法恢复原始数据,最后反序列化还原结构。

  1. 解码输入: 先 Base64 解码外层字符串,再转为 JSON 对象,分离出 iv 和 value。
  2. 还原 IV: 将保存的 Base64 IV 解码回原始二进制字符串。
  3. 执行解密: 调用 openssl_decrypt(),传入密文、算法、密钥及解码后的 IV。
  4. 反序列化: 使用 unserialize() 还原原始数据结构。若解析失败,通常返回默认值或 false。
function decrypt($encrypt) {
  // 1. 定义与加密时相同的密钥
  $key = '1112121212121212121212';
  
  // 2. 解码输入数据
  // 先base64_decode去除外层编码,再json_decode获取内部结构
  $encrypt_data = json_decode(base64_decode($encrypt), true);
  
  if (!$encrypt_data) {
      return 0; // 无效数据
  }
  
  // 3. 还原IV
  $iv = base64_decode($encrypt_data['iv']);
  
  // 4. 执行解密
  $decrypt = openssl_decrypt(
    $encrypt_data['value'], 
    'AES-256-CBC', 
    $key, 
    0, 
    $iv
  );
  
  // 5. 反序列化
  $id = unserialize($decrypt);
  
  // 6. 验证结果有效性
  if ($id !== false) {
    return $id;
  } else {
    return 0;
  }
}

注意事项与安全建议

  • 密钥安全: 示例中的密钥为简单字符串,生产环境中应使用更复杂的随机密钥,并确保密钥不硬编码在源代码中,最好通过环境变量或密钥管理服务获取。
  • IV 的唯一性: AES-CBC 模式下,每次加密建议使用随机生成的 IV。示例中将 IV 随密文一起存储(Base64化),这是正确的做法,保证了相同明文在不同时间加密会产生不同密文。
  • 错误处理: openssl_encrypt/decrypt 在失败时会返回 false,建议在代码中加入对返回值的判断,防止异常数据进入后续逻辑。
以上就是PHP实现基于openssl的AES加密解密方法的详细内容,更多关于PHP openssl加密技术的资料请关注本站其它相关文章!
相关标签:

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

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 算法库。