是否可以加密.env文件中的信息(在Laravel中)?



基本上,我想保护数据库连接和其他AWS信息。下面是 laravel .env 的示例文件

APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"

现在可以从 Laravel 9.32 开始。 https://github.com/laravel/framework/pull/44034#issue-1364610312

运行php artisan env:encrypt将在项目的根目录中查找.env文件,获取文件的内容,使用新密钥对其进行加密并将其另存为.env.encrypted。 解密密钥与使用的密码和加密文件的路径一起显示在命令的输出中。

env

:decrypt 命令解密加密环境文件的内容,并将输出写入所选环境的 .env。 运行此命令需要解密密钥。php artisan env:decrypt --key=h9kAPUmxdZ8ZbwT3

上面提供的问题链接中提到了更多加密和解密选项。

选项 1。使用这样的东西(GitHub Laravel Encryptenv(。

您的里程可能会有所不同,因为它并不容易维护和设置。

选项 2.烹饪上述的变体(但更简单(。在您的配置/数据库.php文件中:

use IlluminateEncryptionEncrypter;
$key = getenv('SECRETKEY');
$encrypter = new Encrypter($key, 'aes-128-cbc');
//...
'mysql' => [
//...
'password' => $encrypter->decrypt(env('DB_PASSWORD', '')),

显然,SECRETKEY是一个保存解密密钥的环境变量。

您可能会问"我从哪里获得解密密钥SECRETKEY?

一种选择是通过您的Web服务器注入它,例如在您的nginx配置中,在sites-enabled/001-yoursite.conf配置中:

location ~ .php$ {
set $script_filename $document_root$fastcgi_script_name;
set $configkey "";
if ($script_filename = "/var/www/yoursitepath/html/public/index.php") {
set $configkey "AAAAAAAAAAAAAAAA";
}
fastcgi_param SCRIPT_FILENAME $script_filename;
fastcgi_param CONFIGKEY $configkey;

其中"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA如果您想要更大的密钥(以及更可疑的安全性(,请随意切换到AES-256-CBC。

以上仅提供您的 Laravel 索引.php文件的密钥。这种限制的原因是,任何可以在您的 webroot 中创建 PHP 文件的人都可以打印密钥的值,因此您的整个纸牌屋都会崩溃。

为了使上述内容具有任何有意义的保护:

  1. 您必须将 nginx 配置文件 001-yoursite.conf 限制为只能由 root 读取。
  2. 您必须禁止任何人修改索引.php(chmod 440 索引.php(。如果您允许常规系统用户修改您的索引.php,他们将能够轻松打印出您的"密钥"。

上述"加密"只能防止肩膀冲浪攻击之类的东西,绝不是适当的安全措施的替代品,例如仔细配置您的 webroot、强化等。

以上主要适用于需要让合规 beancounter 满意的场景。

最新更新