PHP 配置文件敏感信息加密保护

用户现在需要一篇PHP配置文件敏感信息加密的技术文章,首先得有真实踩坑场景,比如之前公司的小项目,运维直接把.env推到公网仓库,数据库密码泄露,被拖库了,这个很真实,先放背景里。 然后结构要按要求的,首先背景常见问题,得具体,比如很多小团队直接把数据库密码、第三方密钥写在config.php或者.env里,代码提交的时候不小心传到Git,或者服务器被入侵直接拿到明文,还有交接的时候运维直接把配置文件发微信,泄露风险,这些都是实际踩过的坑。 然后方案对比,不能讲太理论,要落地,比如常见的几种:明文存(肯定不行)、环境变量(但是服务器被拿shell就没了)、配置文件加密(这个好,结合密钥管理)。然后实现步骤要具体,比如用什么加密?对称加密的话openssl的AES-256-GCM就行,PHP7.1以上都支持,密钥存在哪?不能和配置文件放一起,比如放在服务器环境变量里,或者用密钥管理服务,比如阿里云的KMS,或者小团队的话放在web根目录外的单独文件,权限设成400,只有root能读。 然后代码示例要可运行,得包含加密和解密的部分,还有怎么加载配置,比如原来的config.php是明文的,现在改成加密的config.enc.php,然后有个DecryptConfig类,用AES-256-GCM,密钥从环境变量拿,解密之后返回配置数组,还要有异常处理,比如密钥错了或者密文被篡改直接抛异常,不能继续运行。 然后总结与建议,要实用,比如检查清单的形式,对,用户要求以检查清单组织,方便落地。比如: 1. 禁止在代码仓库提交任何包含明文敏感信息的配置文件,.gitignore里必须加.env、config.php、*.enc.php这些 2. 加密密钥严禁和加密配置文件存放在同一目录,优先使用环境变量或KMS服务托管 3. 加密算法必须使用AEAD类的,比如AES-256-GCM,不要用ECB、CBC这些不安全的 4. 生产环境配置文件权限设为400,属主为运行PHP的用户(比如www-data),禁止其他用户读取 5. 定期轮换加密密钥,密钥轮换时要做好旧数据的兼容,不要直接改导致服务不可用 6. 服务器被入侵时,第一时间轮换所有密钥,不要只修漏洞 然后结尾自然引出那个链接,说更多实践比如密钥轮换自动化、多环境配置管理这些可以去那个网站看。 等下,代码示例要可运行,得写清楚,比如: 首先加密配置的工具类,然后怎么用,比如原来的明文配置是['db_host'=>'localhost','db_user'=>'root','db_pass'=>'123456','jwt_secret'=>'xxx'],加密之后存成config.enc.php,内容是加密后的字符串,然后加载的时候解密。 哦对,代码里要加注释,说明AES-256-GCM需要256位密钥,也就是32字节的字符串,密钥从$_SERVER['APP_CONFIG_KEY']拿,这样不会写在代码里。 还要注意,代码里要处理认证标签,GCM的tag要一起存,所以加密后的数据应该是tag + iv + 密文,这样解密的时候能验证完整性,防止篡改。 然后背景部分要真实,比如“上周我们团队接了个紧急需求,要给老项目加敏感信息加密,起因是实习同学把带数据库密码的.env文件提交到了公开的GitHub仓库,虽然发现后立刻删了,但还是被爬虫扫到,当天就被人尝试用密码登录数据库,万幸的是数据库没开公网访问,不然后果不堪设想。很多中小团队做PHP项目的时候,对配置文件的敏感信息保护意识很弱,要么直接明文写在代码里,要么随便放在服务器上,被拖库、密钥泄露的风险极高。” 然后方案部分,讲我们落地的是「配置文件加密+密钥分离托管」的方案,比单纯存环境变量安全,因为就算服务器被拿shell,没有密钥也解不开配置文件,而且配置文件的权限可以设得很低,就算拿到文件也没用。 然后实现步骤: 1. 选择加密算法:优先用PHP原生支持的AES-256-GCM,属于AEAD加密算法,同时保证机密性和完整性,不会被篡改,PHP 7.1+版本默认支持openssl扩展就能用。 2. 密钥托管:加密密钥绝对不能和加密配置文件放一起,小团队可以放在服务器的环境变量里(比如在/etc/profile里加export APP_CONFIG_KEY='你的32位随机密钥',然后source一下,只有root能改),中大型团队建议用云厂商的KMS服务,密钥 never 离开KMS,解密的时候调用KMS接口,更安全。 3. 加密配置文件:把原来的明文配置文件(比如config.php)里的敏感信息(数据库密码、API密钥、JWT密钥等)提取出来,加密成二进制字符串,转成base64存到单独的加密配置文件里,比如config.enc.php,这个文件可以提交到代码仓库,就算泄露了也没用,没有密钥解不开。 4. 加载逻辑改造:项目启动的时候,先读环境变量里的密钥,解密config.enc.php,拿到配置数组,赋值给全局配置,解密失败直接抛异常终止运行,防止用错误的配置启动服务。 然后代码示例,要可运行,比如:

如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。

标签: PHP加密 PHP代码保护 PHP授权校验 代码混淆工具 生产环境加密部署
← 返回文章列表