Template reusable untuk project PHP yang perlu membaca .env berisi value terenkripsi dengan format kompatibel envcrypt.
Format yang didukung:
encrypted:<base64(nonce + ciphertext + tag)>
Detail kompatibilitas:
- Algorithm:
AES-256-GCM - Key: 32 byte / 64 hex chars
- Nonce/IV: 12 byte
- Auth tag: 16 byte
- Payload:
nonce(12) + ciphertext + tag(16)
Gunakan template ini ketika:
- Project PHP native di shared hosting/CyberPanel perlu menyimpan secret secara aman.
.envperlu tetap bisa dibaca aplikasi, tapi value rahasianya tidak plaintext.- Agentic coding/AI sering membaca folder project dan kamu ingin mengurangi risiko secret terbaca.
- Kamu ingin standar bootstrap yang sama untuk banyak project PHP.
Template ini melindungi secret saat tersimpan di file. Saat runtime, value tetap menjadi plaintext di getenv(), $_ENV, dan $_SERVER agar aplikasi PHP bisa memakainya.
php-envcrypt-template/
├── src/EnvCrypt.php
├── bin/envcrypt-php
├── scripts/install-envcrypt.php
├── scripts/lint.php
├── tests/compat.php
├── tests/install.php
├── examples/
│ ├── native/
│ │ ├── .env.example
│ │ └── public_html/index.php
│ └── frameworks/
│ ├── laravel-bootstrap.php
│ └── codeigniter4-preload.php
└── composer.json
Struktur yang disarankan:
project/
├── src/
│ └── EnvCrypt.php
├── .env
└── public_html/
└── index.php
Jangan taruh .env di dalam public_html. Template ini juga mengabaikan .env dan .env.* dari Git secara default agar secret tidak ikut ter-commit. Jika terpaksa menaruh .env di area web, blokir akses web server dengan .htaccess.
Bootstrap di public_html/index.php:
<?php
require_once __DIR__ . '/../src/EnvCrypt.php';
use Jankricuntuk\EnvCrypt\EnvCrypt;
EnvCrypt::load(__DIR__ . '/../.env');Jika entrypoint project ada di root index.php, path-nya berbeda:
require_once __DIR__ . '/src/EnvCrypt.php';
\Jankricuntuk\EnvCrypt\EnvCrypt::load(__DIR__ . '/.env');Contoh .env:
APP_ENV=production
DB_HOST=localhost
DB_PASSWORD=encrypted:replace-with-envcrypt-value
API_KEY=encrypted:replace-with-envcrypt-valueSetelah load, value bisa dipakai seperti biasa:
$password = getenv('DB_PASSWORD');Laravel sudah punya loader .env, jadi jangan asal mengganti workflow-nya. Pilihan aman:
- Load
EnvCrypt::load()sebelum Laravel membaca config. - Jangan commit key ke repository.
- Pastikan config cache dibuat setelah env terenkripsi bisa didekripsi di server.
Contoh preload ada di:
examples/frameworks/laravel-bootstrap.php
Konsepnya:
require_once __DIR__ . '/../vendor/autoload.php';
\Jankricuntuk\EnvCrypt\EnvCrypt::load(__DIR__ . '/../.env');Untuk Laravel production, jalankan ini sebelum config:cache, atau buat service/bootstrap khusus yang berjalan sebelum konfigurasi final dipakai.
Tambahkan loader sebelum framework bootstrap di public/index.php:
require_once __DIR__ . '/../vendor/autoload.php';
\Jankricuntuk\EnvCrypt\EnvCrypt::load(__DIR__ . '/../.env');Contoh ada di:
examples/frameworks/codeigniter4-preload.php
Gunakan prinsip yang sama:
- Load file
.envterenkripsi seawal mungkin. - Pastikan berjalan sebelum container/config membaca env.
- Untuk production, pertimbangkan env var server langsung untuk secret paling sensitif.
Prioritas rekomendasi:
Paling cocok untuk shared hosting yang mendukung pengaturan env:
ENVCRYPT_KEY=64hexcharacters...
Jika server tidak mudah mengatur env var, simpan di luar public_html:
/home/user/.envcrypt.yaml
Isi file:
key: "64hexcharacters..."Jangan commit .envcrypt.yaml ke repository. Untuk shared hosting, set permission file key seketat mungkin:
chmod 600 ~/.envcrypt.yamlGenerate key:
php bin/envcrypt-php key:generateDecrypt satu value:
ENVCRYPT_KEY='64hexkey...' php bin/envcrypt-php decrypt:value 'encrypted:...'Cek load .env:
ENVCRYPT_KEY='64hexkey...' php bin/envcrypt-php load:check .envHindari menulis key langsung sebagai argumen command jika server dipakai banyak user, karena argumen bisa tersimpan di shell history atau terlihat di process list.
Parser template ini sengaja sederhana agar cocok untuk shared hosting tanpa dependency tambahan. Yang didukung:
- Baris
KEY=VALUE - Komentar yang diawali
# - Quote luar sederhana:
"value"atau'value' - Value terenkripsi dengan prefix
encrypted:
Yang tidak ditargetkan: ekspansi variabel kompleks, multiline dotenv, dan escape rule khusus framework. Untuk kebutuhan itu, load envcrypt sebelum dotenv framework atau adaptasikan loader sesuai parser framework.
Saat agent/AI membuat atau membuka project PHP, gunakan rule ini:
- Deteksi PHP project dari
composer.json,index.php,public/index.php,public_html/index.php,artisan, atau file*.php. - Jika project memakai secret
.env, pasangsrc/EnvCrypt.phpatau package ini. - Deteksi entrypoint:
- Native/shared hosting:
public_html/index.php,public/index.php, atauindex.php. - Laravel:
bootstrap/app.phpatau bootstrap sebelum config dibaca. - CodeIgniter/custom:
public/index.php.
- Native/shared hosting:
- Inject
EnvCrypt::load()sebelum aplikasi membaca config/database. - Pastikan key tidak masuk repo: gunakan
ENVCRYPT_KEYatau.envcrypt.yamldi luar webroot. - Tambahkan test decrypt kecil sebelum deploy.
- Dokumentasikan di README project tempat key disimpan dan cara rotasi key.
Untuk project besar, lebih baik ubah template ini menjadi Composer package private/public agar semua project cukup menjalankan:
composer require jankricuntuk/php-envcrypt-templateUntuk secret yang sangat sensitif, pertimbangkan juga secret manager dari provider hosting/VPS. envcrypt cocok untuk mengurangi risiko secret bocor dari file project, tetapi bukan pengganti penuh untuk secret manager production.
Lint semua file PHP:
composer run lintTest kompatibilitas decrypt:
composer run testAtau tanpa Composer:
php scripts/lint.php
php tests/compat.php
php tests/install.php