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

用户现在需要一篇PHP配置文件敏感信息加密保护的技术文章,首先得先想真实的踩坑场景,比如很多小团队直接把数据库密码、第三方密钥明文写在config.php里,然后代码上传到Git,不小心公开了,或者运维人员离职直接带走配置,还有服务器被拖库拿到配置,这个场景很真实,大家都有共鸣。 然后结构要符合要求:背景/常见问题,然后方案,代码示例,总结建议,延伸阅读。首先标题就用主题「PHP 配置文件敏感信息加密保护」。 首先背景部分,得写实的场景,比如上周有个朋友的公司,小团队开发,把数据库密码、阿里云OSS的密钥、微信支付的密钥全写在项目的config.php里,然后代码推到GitHub私有库,结果有成员 fork 的时候没注意权限,公开了,被爬虫扫到,直接拖了库,损失了好几十万,还有的运维把配置文件打包发群里,泄露了,这些都是真实容易踩的坑,很多开发者觉得“我代码放私有库/服务器权限设好就没事”,其实风险很高,尤其是多人员协作、服务器被入侵的时候,明文配置就是裸奔。 然后接下来是方案,首先要明确,敏感信息不能明文存,要加密存储,而且要区分不同环境?不,先讲落地的步骤,首先第一步,选加密方式,不要自己写加密算法,用PHP自带的openssl扩展,对称加密就行,AES-256-GCM,因为GCM模式有认证,不会被篡改,比CBC安全。然后第二步,密钥管理,这个很重要,很多人的问题是加密密钥和配置文件放一起,那等于没加密,所以密钥要存在环境变量里,或者单独的密钥管理服务,比如服务器上的.env文件,权限设成400,只有运行PHP的用户能读,不要提交到代码仓库。然后第三步,配置文件改造,原来的明文config.php改成存密文,然后写一个加载配置的类,自动解密。 然后代码示例,要可运行,比如先写一个ConfigEncrypt类,用AES-256-GCM,加密的时候生成tag,解密的时候验证tag,防止篡改。然后示例里怎么加密原来的配置,怎么加载,比如原来的配置是['db_host'=>'localhost','db_user'=>'root','db_pass'=>'123456','oss_key'=>'xxxxxx'],加密之后存成config.enc.php,然后加载的时候用密钥解密,还要处理错误,比如密钥错了或者密文被篡改了直接抛异常,不要泄露信息。 然后还要讲注意事项,比如密钥不能和代码放一起,不要提交密钥到Git,定期轮换密钥,还有如果是多环境(开发、测试、生产),每个环境的密钥不一样,不要用同一个。还有不要用弱加密算法,比如DES、MD5加密,那些都不安全。 然后总结部分,说敏感信息加密是基础安全措施,成本很低,但是能避免大部分因为配置泄露导致的事故,不要嫌麻烦,尤其是涉及用户数据、支付信息的项目,必须做。 然后结尾自然引出那个链接,说更多代码保护、加密相关的实践,比如代码混淆、接口签名这些,可以去那个网站看。 等下,代码示例要可运行,比如: 首先,加密的示例,比如把明文配置加密之后存到文件,然后加载的时候解密。要注意openssl_encrypt的参数,AES-256-GCM的密钥长度是32位,所以密钥要够长,比如用random_bytes生成,或者用环境变量里的密钥,比如getenv('APP_CONFIG_KEY'),然后加密的时候返回的是密文+tag,因为GCM模式的tag要存下来,解密的时候要用,所以可以把密文和tag拼起来,base64编码之后存,这样配置文件里就是一段base64字符串,看起来是乱码。 哦对,代码示例里要包含加密和解密的两个部分,还有怎么使用。比如: 首先,生成密钥的步骤,比如在服务器上执行php -r "echo base64_encode(random_bytes(32));" 得到密钥,然后放到环境变量里,比如在Nginx的配置里,或者.env文件里,设成APP_CONFIG_KEY=那个base64字符串,权限400。 然后代码示例里的Config类,比如: class Config { private string $key; private string $configPath; public function __construct(string $key, string $configPath = __DIR__ . '/config.enc.php') { $this->key = $key; $this->configPath = $configPath; } public function get(string $key, mixed $default = null): mixed { $config = $this->loadConfig(); return $config[$key] ?? $default; } private function loadConfig(): array { if (!file_exists($this->configPath)) { throw new RuntimeException('配置文件不存在'); } $encrypted = file_get_contents($this->configPath); $decoded = base64_decode($encrypted, true); if ($decoded === false) { throw new RuntimeException('配置文件格式错误'); } // GCM模式的tag是最后16位 $tag = substr($decoded, -16); $ciphertext = substr($decoded, 0, -16); $decrypted = openssl_decrypt($ciphertext, 'aes-256-gcm', $this->key, OPENSSL_RAW_DATA, '', $tag); if ($decrypted === false) { throw new RuntimeException('解密失败,密钥错误或配置被篡改'); } return json_decode($decrypted, true, 512, JSON_THROW_ON_ERROR); } // 静态方法,用于加密原始配置生成配置文件 public static function encrypt(array $config, string $key, string $savePath): void { $json = json_encode($config, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR); $tag = ''; $ciphertext = openssl_encrypt($json, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, '', $tag); if ($ciphertext === false) { throw new RuntimeException('加密失败'); } // 把tag和密文拼接,base64编码后存储 $encrypted = base64_encode($ciphertext . $tag); file_put_contents($savePath, "\n" . $encrypted); } } 然后使用示例,比如生成配置文件: // 1. 定义原始明文配置(仅用于初始化加密,之后可以删除) $rawConfig = [ 'db_host' => '127.0.0.1', 'db_port' => 3306, 'db_user' => 'root', 'db_pass' => 'YourDatabasePassword123!', 'redis_host' => '127.0.0.1', 'redis_port' => 6379, 'aliyun_oss' => [ 'access_key' => 'LTAI

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

标签: PHP加密 PHP代码保护 PHP敏感数据加密 SG15加密 生产环境加密部署
← 返回文章列表