讲师中心 微信公众号
AI工具推荐 视频效率加速

PHP如何创建文件并加密_简单文件加密解密方法【详解】

秋涛小哥_9722

秋涛小哥_9722

发布时间:2026-02-18 17:29:41

|

178人浏览过

|

来源于php中文网

原创

PHP无法自动加密文件,需先用openssl_encrypt加密内容再写入:生成32字节密钥和16字节随机IV,加密后JSON封装IV与密文并base64编码,最后file_put_contents写入;读取时反向操作,严格校验openssl_decrypt返回false。

php如何创建文件并加密_简单文件加密解密方法【详解】

PHP用file_put_contents创建文件时如何同步加密

直接写明:PHP本身不提供“自动加密文件”的内置函数,所谓“创建并加密”,本质是先生成加密后的内容,再写入文件。关键在加密逻辑必须在file_put_contents之前完成。

常见错误是试图把加密逻辑塞进路径参数或误用fopen的模式(如'wb+encrypted'),这会直接报错——PHP的文件操作函数不识别加密模式。

  • 推荐用openssl_encrypt处理原始内容,再用file_put_contents写入密文
  • 加密前务必确认OpenSSL扩展已启用(extension=openssl在php.ini中未被注释)
  • 密钥长度必须匹配所选算法(如AES-256-CBC要求32字节密钥,不足需hash('sha256', $key)补足)
  • 不要硬编码密钥,生产环境应从环境变量或配置中心读取

用openssl_encrypt和openssl_decrypt做对称加解密

这是PHP最可靠、无需额外依赖的方案。注意它不是“文件级”加密,而是“内容级”——你得自己读/写文件,加解密只作用于字符串。

典型流程:读文件 → 解密内容 → 处理 → 重新加密 → 写回。不能跳过中间的字符串操作步骤。

立即学习“PHP免费学习笔记(深入)”;

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • 必须指定$method(如'AES-256-CBC')、$key、$iv(初始化向量),三者缺一不可
  • $iv必须随机生成且每次不同,但解密时需原样复用——通常和密文一起存储(如JSON打包:['iv' => base64_encode($iv), 'data' => base64_encode($ciphertext)])
  • 加密后的内容是二进制,写入文件前建议base64_encode转为可读字符串,否则可能损坏(尤其Windows下换行符干扰)
  • 解密失败时openssl_decrypt返回false,不是空字符串,需用=== false严格判断

为什么不用mcrypt或自定义XOR?

mcrypt在PHP 7.2+已被彻底移除,任何还在用mcrypt_encrypt的代码在新版PHP上必然报Fatal error: Uncaught Error: Call to undefined function mcrypt_encrypt()。别碰它。

XOR加密看似简单($data ^ $key),但实际极不安全:密钥重复使用会导致频率分析破解;无法抵抗已知明文攻击;且不处理填充、块对齐等底层问题。

  • 如果只是临时保护日志或缓存文件,且对安全性要求不高,可用base64_encode + 自定义混淆(比如翻转字符串再base64),但必须明确标注“仅防误读,非加密”
  • 真要防窃取,必须用OpenSSL标准算法,配合正确密钥管理和IV生成
  • 注意openssl_encrypt默认使用PKCS#7填充,解密时无需手动处理——这点比手写填充逻辑可靠得多

加密文件的读取和解密完整示例

以下代码演示从创建加密文件到读取解密的闭环,重点看$iv的保存与复用逻辑:

// 创建加密文件
$data = '敏感配置:db_password=123456';
$key = hash('sha256', 'my_secret_key', true); // 32字节密钥
$iv = openssl_random_pseudo_bytes(16); // AES-256-CBC需要16字节IV
$ciphertext = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv);
$encoded = json_encode([
    'iv' => base64_encode($iv),
    'data' => base64_encode($ciphertext)
]);
file_put_contents('/tmp/config.enc', $encoded);

// 读取并解密
$raw = file_get_contents('/tmp/config.enc');
$payload = json_decode($raw, true);
$iv = base64_decode($payload['iv']);
$ciphertext = base64_decode($payload['data']);
$decrypted = openssl_decrypt($ciphertext, 'AES-256-CBC', $key, 0, $iv);
echo $decrypted; // 输出原始字符串

IV和密文必须成对保存,漏掉任何一个环节,解密就彻底失败。这个细节在调试时最容易被忽略——尤其是当json_encode因特殊字符出错,或base64_decode遇到换行截断时,错误信息极其隐蔽。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2215

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3542

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1176

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4079

2025.09.10

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1029

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3200

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1838

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2924

2023.09.04

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn