hegelmax / env-secured
Encrypted configuration manager for PHP (EnvSecured).
Installs: 4
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/hegelmax/env-secured
Requires
- php: >=8.1
- ext-sodium: *
README
EnvSecured is a lightweight, secure, and self-contained PHP module for storing sensitive configuration values (API keys, database credentials, tokens, secrets) in an encrypted file and provides a clean interface to access them in runtime.
โญ Key Features
- ๐ Encrypted config file (
config.enc) - ๐ Browser-based UI for editing settings
- ๐ค JSON export (download)
- ๐ฅ JSON import (load file into form)
- ๐ Automatic key generation (
keys/*.key) - ๐งฌ Server-bound encryption (fingerprint-based)
- ๐งฉ Zero global functions โ everything wrapped in PHP classes
- ๐ Drop-in integration into any project
- โ๏ธ Can be used:
- with Composer
- without Composer
๐๏ธ Project Structure
env_secured/
โโโ _init.php โ Bootloader (entry point)
โโโ libs/
โ โโโ EnvSecured.php โ Main config manager
โ โโโ EnvSecuredCrypto.php โ Encryption engine
โ โโโ html/
โ โโโ page_form.php โ UI template: config editor
โ โโโ page_success.php โ UI template: success page
โ โโโ page_error.php โ UI template: error page
โโโ configs/ โ Encrypted config files (auto-created)
โ โโโ config.enc โ Main encrypted config (auto-created)
โโโ keys/ โ Key files (auto-created)
โโโ sodium.key โ Internal crypto key
โโโ secret.key โ Master secret key
Both configs/ and keys/ directories are created automatically on first use if they do not exist.
๐ฆ Installation
Option A โ Composer (recommended)
composer require hegelmax/env-secured
Option B โ No Composer
Download the directory:
env_secured/
and place it anywhere in your project.
๐ Quick Start (Composer version)
require __DIR__ . '/vendor/autoload.php'; use EnvSecured\EnvSecured; $envRoot = __DIR__ . '/env'; // Directory for configs/ and keys/ $env = new EnvSecured($envRoot); $env->run(); // Retrieve configuration $config = EnvSecured::get(); // full array $dbHost = EnvSecured::get('DB_HOST'); // single value
๐ Quick Start (No Composer)
require __DIR__ . '/env_secured/init.php';
Then read configuration via:
$env = EnvSecured::get(); // array echo EnvSecured::get('API_URL');
๐ฅ๏ธ First Run โ Creating Config
When no encrypted config exists, opening your init script in a browser shows the Config Editor UI:
/env_secured/init.php
UI allows:
โ Editing KEY=value rows
โ Saving encrypted config (config.enc)
โ Downloading JSON
โ Loading JSON into form
Folders created automatically:
env/
configs/
config.enc
keys/
sodium.key
secret.key
๐ Encryption Model
EnvSecured uses:
- 256-bit
sodium.key - 256-bit
secret.key - machine + project fingerprint
- XSalsa20-Poly1305 (libsodium)
- unique nonce per encryption
- atomic writes to prevent corruption
Conceptually:
fingerprint = HASH( hostname | projectRoot | secret.key )
finalKey = HASH( fingerprint | sodium.key )
cipher = base64( nonce | secretbox(plaintext, nonce, finalKey) )
๐ก๏ธ Why It's Safe
- Keys stored outside web root (in
env_secured/keys/) - Config stored encrypted (
env_secured/configs/config.enc) - No plaintext config on server
- No global functions โ no name collisions
- Atomic writes for safe file operations
- Encryption relies on libsodium (modern & secure)
โ๏ธ Configuration in Code
Once EnvSecured loads the config:
1๏ธโฃ Array access
$config = EnvSecured::get(); echo $config['DB_HOST'];
2๏ธโฃ Single value
echo EnvSecured::get('API_TOKEN');
3๏ธโฃ Global constants
If constant autodefine is enabled:
echo API_TOKEN;
Enable via:
const ENV_SECURED_CONFIG_DEFINE_CONST = true;
๐ ๏ธ Optional Constants
Place them before calling EnvSecured.
const ENV_SECURED_CONFIG_SCHEMA = 'prod'; const ENV_SECURED_CONFIG_ALLOW_EDIT = false; const ENV_SECURED_CONFIG_ALLOW_SESSION = true; const ENV_SECURED_CONFIG_DEFINE_CONST = true; const ENV_SECURED_DEFAULTS = [ ['key' => 'DB_HOST', 'value' => 'localhost'], ['key' => 'API_URL', 'value' => 'https://localhost/api'], ];
๐ง Requirements
- PHP 8.1+
ext-sodiumenabled- Writable directory for:
configs/keys/
๐ป JSON Import / Export
EnvSecured supports configuration migration via JSON file, that can be useful for:
- migrations
- backups
- moving configs between servers
- Dev โ Prod workflows
Export (Download JSON)
Downloads a readable .json file containing all config values.
Import (Load JSON)
Loads a .json file directly in the browser and fills the config form.
No data is sent to the server until Save (encrypted) is pressed.
๐ค Migrating Between Servers
- On old server โ open UI โ Download JSON
- Transfer the downloaded file to the new server
- On new server โ open UI โ Load JSON
- Click Save (encrypted)
A new encrypted config is generated automatically for the new environment; secret keys remain private.
๐งช Self-Test (Optional)
Temporary snippet:
require_once __DIR__ . '/env_secured/_init.php'; $cipher = (new EnvSecuredCrypto(__DIR__ . '/env_secured'))->encrypt("test"); var_dump($cipher);
Then ensure:
(new EnvSecuredCrypto(__DIR__ . '/env_secured'))->decrypt($cipher) === "test";
๐ License
MIT License. Free for commercial use.
ยฉ 2025 Maxim Hegel