
Product
Introducing Scala and Kotlin Support in Socket
Socket now supports Scala and Kotlin, bringing AI-powered threat detection to JVM projects with easy manifest generation and fast, accurate scans.
encrypted-env-loader
Advanced tools
A secure Python package for managing encrypted environment variables. Load sensitive configuration from encrypted .env
files using Fernet encryption, with convenient keyring integration for local development.
pip install encrypted-env-loader
# Generate new encrypted file with random key
encrypted-env init
# Output: Encryption key: gAAAAABh...
# Output: Set your encryption key: export ENCRYPTED_ENV_KEY='gAAAAABh...'
# Set the key in your shell
export ENCRYPTED_ENV_KEY='gAAAAABh...'
# Opens decrypted content in $EDITOR, re-encrypts on save
encrypted-env edit
# Run any command with encrypted env loaded
encrypted-env run -- python app.py
encrypted-env run -- ./deploy.sh
# Load into current shell (fish)
eval (encrypted-env load)
# Load into current shell (bash/zsh)
eval $(encrypted-env load)
For local development, store encryption keys securely in your system keyring instead of environment variables:
# Generate and store key for default profile
encrypted-env keyring set-key
# Store key for specific environment
encrypted-env keyring set-key --profile dev
encrypted-env keyring set-key --profile prod
# Automatically uses keyring-stored key
encrypted-env run --profile dev -- python app.py
encrypted-env load --profile dev
encrypted-env edit --profile dev
# Force environment variable usage (skip keyring)
encrypted-env run --profile prod --no-keyring -- ./deploy.sh
export ENCRYPTED_ENV_KEY="your-key-here"
encrypted-env load --profile prod --no-keyring
# List stored keys
encrypted-env keyring list-keys
# Retrieve a key
encrypted-env keyring get-key --profile dev
# Delete a key
encrypted-env keyring delete-key --profile dev
Key Benefits:
All commands support --quiet
mode for CI environments and have secure defaults:
# Generate keys silently (CI-safe)
KEY=$(encrypted-env generate-key --quiet)
# Show variable names only (never exposes values)
encrypted-env show --names-only
# Validate files without output (exit codes only)
encrypted-env validate --quiet
By default, commands mask sensitive values:
# Safe - shows masked values
encrypted-env show
# Output: DATABASE_URL=***
# API_KEY=***
# Requires explicit flag to show values
encrypted-env show --show-values # WARNING: exposes secrets
Run the comprehensive demo to see all features:
# Interactive demo with full output
./examples/demo.sh
# CI-friendly mode (no secrets exposed)
./examples/demo.sh --ci
# View usage examples
./examples/basic_usage.sh
run
- Execute commands with encrypted environmentencrypted-env run [--file FILE] [--profile PROFILE] [--no-keyring] -- <command>
# Examples
encrypted-env run -- python app.py
encrypted-env run --profile prod -- ./deploy.sh
encrypted-env run --file .env.custom.encrypted -- npm start
encrypted-env run --profile dev --no-keyring -- python app.py # force env var usage
load
- Generate shell commands to load environmentencrypted-env load [--file FILE] [--profile PROFILE] [--shell SHELL] [--quiet] [--no-keyring]
# Usage in fish shell
eval (encrypted-env load)
eval (encrypted-env load --profile dev)
eval (encrypted-env load --profile prod --no-keyring) # force env var usage
# Usage in bash/zsh
eval $(encrypted-env load)
eval $(encrypted-env load --profile prod)
clear
- Generate shell commands to clear environmentencrypted-env clear [--file FILE] [--profile PROFILE] [--shell SHELL] [--quiet] [--no-keyring]
# Usage
eval (encrypted-env clear) # fish
eval $(encrypted-env clear) # bash/zsh
init
- Create new encrypted environment fileencrypted-env init [--file FILE] [--profile PROFILE] [--key-file KEYFILE] [--quiet]
# Examples
encrypted-env init # creates .env.encrypted
encrypted-env init --profile dev # creates .env.dev.encrypted
encrypted-env init --key-file .env.key # saves key to file
encrypted-env init --quiet # CI-friendly (key only)
encrypt
- Encrypt existing .env fileencrypted-env encrypt <source> [--output OUTPUT] [--profile PROFILE] [--quiet]
# Examples
encrypted-env encrypt .env # creates .env.encrypted
encrypted-env encrypt .env.dev --profile dev # creates .env.dev.encrypted
encrypted-env encrypt .env --output custom.encrypted
decrypt
- Decrypt to filesystemencrypted-env decrypt [--file FILE] [--output OUTPUT] [--profile PROFILE] [--quiet]
# Examples
encrypted-env decrypt # decrypts to .env
encrypted-env decrypt --profile dev # decrypts .env.dev.encrypted to .env
encrypted-env decrypt --output .env.backup # custom output file
edit
- Safely edit encrypted filesencrypted-env edit [--file FILE] [--profile PROFILE] [--quiet]
# Opens in $EDITOR (vi by default)
# Creates backup before editing
# Validates .env format before re-encrypting
encrypted-env edit --profile prod
generate-key
- Generate new encryption keyencrypted-env generate-key [--quiet]
# Interactive mode
encrypted-env generate-key
# Output: Generated key: gAAAAABh...
# CI mode
encrypted-env generate-key --quiet
# Output: gAAAAABh...
rekey
- Change encryption keyencrypted-env rekey [--file FILE] [--profile PROFILE] [--old-key-env VAR] [--new-key-env VAR] [--quiet]
# Examples
ENCRYPTED_ENV_KEY="old_key" NEW_KEY="new_key" encrypted-env rekey --new-key-env NEW_KEY
encrypted-env rekey --quiet # generates new random key silently
keyring set-key
- Store encryption key in system keyringencrypted-env keyring set-key [--profile PROFILE] [--key KEY] [--quiet]
# Examples
encrypted-env keyring set-key # generates key for default profile
encrypted-env keyring set-key --profile dev # generates key for dev profile
encrypted-env keyring set-key --key "ABC123" # store specific key
encrypted-env keyring set-key --quiet # CI-friendly output
keyring get-key
- Retrieve encryption key from keyringencrypted-env keyring get-key [--profile PROFILE] [--quiet]
# Examples
encrypted-env keyring get-key # get default profile key
encrypted-env keyring get-key --profile dev # get dev profile key
encrypted-env keyring get-key --quiet # key only, no messages
keyring delete-key
- Remove encryption key from keyringencrypted-env keyring delete-key [--profile PROFILE] [--quiet]
# Examples
encrypted-env keyring delete-key # delete default profile key
encrypted-env keyring delete-key --profile dev # delete dev profile key
encrypted-env keyring delete-key --quiet # no confirmation prompt
keyring list-keys
- List all profiles with stored keysencrypted-env keyring list-keys [--quiet]
# Example output:
# Found keys for 3 profiles:
# - default
# - dev
# - prod
# Quiet mode (CI-friendly)
encrypted-env keyring list-keys --quiet
# Output: default
# dev
# prod
Keyring Key Storage:
encrypted-env-loader
){profile}-key
(e.g., dev-key
, default-key
)status
- Show file information and variablesencrypted-env status [--file FILE] [--profile PROFILE] [--no-keyring]
# Example output with keyring:
# File: .env.encrypted
# Exists: True
# Size: 1024 bytes
# Key source: keyring (profile: default)
# Status: Valid (contains 5 variables)
# Variables:
# - DATABASE_URL
# - SECRET_KEY
# Example output with environment variable:
# File: .env.encrypted
# Exists: True
# Size: 1024 bytes
# Key source: $ENCRYPTED_ENV_KEY
# Status: Valid (contains 5 variables)
# Variables:
# - DATABASE_URL
# - SECRET_KEY
# With --no-keyring flag:
# Key source: $ENCRYPTED_ENV_KEY (not found)
# Status: Cannot validate (no key)
validate
- Check if file can be decryptedencrypted-env validate [--file FILE] [--profile PROFILE] [--quiet] [--no-keyring]
# Exit code 0 if valid, 1 if invalid
show
- Display variables (with security options)encrypted-env show [--file FILE] [--profile PROFILE] [--names-only] [--show-values] [--no-keyring]
# Safe default (masks values)
encrypted-env show
# Output: DATABASE_URL=***
# CI-safe (names only)
encrypted-env show --names-only
# Output: DATABASE_URL
# API_KEY
# Explicit flag required to show values
encrypted-env show --show-values # WARNING: exposes secrets
from encrypted_env_loader import load_encrypted_env
# Load with default settings (.env.encrypted, keyring or ENCRYPTED_ENV_KEY)
env_vars = load_encrypted_env()
# Load with specific parameters
env_vars = load_encrypted_env(
key="base64-encoded-key",
file_path=".env.prod.encrypted",
profile="prod",
change_os_env=True, # Updates os.environ
use_keyring=True # Try keyring first (default: True)
)
# Force environment variable usage (skip keyring)
env_vars = load_encrypted_env(
profile="prod",
use_keyring=False
)
from encrypted_env_loader import encrypted_env_context
import os
with encrypted_env_context(profile="dev"):
# Environment variables loaded here (uses keyring automatically)
database_url = os.getenv("DATABASE_URL")
secret_key = os.getenv("SECRET_KEY")
# Environment automatically restored when exiting context
# Force environment variable usage
with encrypted_env_context(profile="prod", use_keyring=False):
# Uses ENCRYPTED_ENV_KEY environment variable
pass
from encrypted_env_loader import with_encrypted_env
import os
@with_encrypted_env(profile="prod")
def deploy_application():
# Function runs with encrypted env loaded (keyring first, then env var)
api_key = os.getenv("API_KEY")
database_url = os.getenv("DATABASE_URL")
# Environment restored after function returns
@with_encrypted_env(profile="prod", use_keyring=False)
def ci_deploy():
# Force environment variable usage for CI/production
pass
deploy_application()
from encrypted_env_loader import (
get_key_from_keyring,
set_key_in_keyring,
delete_key_from_keyring,
list_keyring_profiles,
get_git_repo_name
)
# Get git repository name (used for keyring service name)
repo_name = get_git_repo_name() # e.g., "my-project"
# Store key in keyring
success = set_key_in_keyring("my-secret-key", profile="dev")
# Retrieve key from keyring
key = get_key_from_keyring(profile="dev")
# List profiles with stored keys
profiles = list_keyring_profiles() # ["default", "dev", "prod"]
# Delete key from keyring
success = delete_key_from_keyring(profile="dev")
from encrypted_env_loader import (
generate_key,
encrypt_env_file,
decrypt_env_file,
validate_encrypted_file
)
# Generate encryption key
key = generate_key()
# Encrypt a file (supports keyring)
encrypt_env_file(".env", ".env.encrypted", key)
encrypt_env_file(".env", ".env.encrypted", profile="dev") # uses keyring
encrypt_env_file(".env", ".env.encrypted", profile="dev", use_keyring=False) # force env var
# Decrypt and get variables (supports keyring)
env_vars = decrypt_env_file(".env.encrypted", key=key)
env_vars = decrypt_env_file(".env.encrypted", profile="dev") # uses keyring
env_vars = decrypt_env_file(".env.encrypted", profile="dev", use_keyring=False) # force env var
# Validate file (supports keyring)
is_valid = validate_encrypted_file(".env.encrypted", key=key)
is_valid = validate_encrypted_file(".env.encrypted", profile="dev") # uses keyring
is_valid = validate_encrypted_file(".env.encrypted", profile="dev", use_keyring=False) # force env var
Profiles allow managing multiple environment configurations:
# Profile-based file naming
.env.encrypted # default profile
.env.dev.encrypted # dev profile
.env.prod.encrypted # prod profile
.env.test.encrypted # test profile
# Usage
encrypted-env init --profile dev
encrypted-env run --profile prod -- python app.py
encrypted-env edit --profile test
# Load environment
eval (encrypted-env load --profile dev)
# Clear environment
eval (encrypted-env clear --profile dev)
# One-liner with auto-clear
encrypted-env run --profile dev -- python app.py
# Load environment
eval $(encrypted-env load --profile dev)
# Clear environment
eval $(encrypted-env clear --profile dev)
# Use in loops (eval once, use many times)
eval $(encrypted-env load)
for i in {1..100}; do
curl -H "Authorization: $SECRET_TOKEN" api.example.com/data/$i
done
eval $(encrypted-env clear)
- name: Setup encrypted environment
run: |
# Generate or retrieve key securely
echo "${{ secrets.ENCRYPTED_ENV_KEY }}" > .env.key
export ENCRYPTED_ENV_KEY=$(cat .env.key)
# Validate encrypted file
encrypted-env validate --quiet
# Run tests with encrypted environment
encrypted-env run -- pytest
# Never expose secrets in CI logs
encrypted-env show --names-only # ✅ Safe
encrypted-env validate --quiet # ✅ Safe
encrypted-env generate-key --quiet # ✅ Safe
# Avoid these in CI
encrypted-env show --show-values # ❌ Exposes secrets
encrypted-env status # ❌ May expose info
rekey
command--quiet
and --names-only
flags in automated environmentsThe package provides specific exception types:
from encrypted_env_loader import EncryptedEnvError, DecryptionError, KeyError
try:
load_encrypted_env()
except KeyError:
print("Encryption key missing or invalid")
except DecryptionError:
print("File cannot be decrypted - wrong key or corrupted data")
except EncryptedEnvError:
print("General error with encrypted environment operations")
git clone https://github.com/igutekunst/encrypted-env-loader
cd encrypted-env-loader
pip install -e ".[dev]"
# Run unit tests
pytest
# Run full demo/integration tests
./examples/demo.sh
# Run CI-safe tests
./examples/demo.sh --ci
# Test coverage
pytest --cov=encrypted_env_loader
black src tests
isort src tests
flake8 src tests
mypy src
MIT License - see LICENSE file.
keyring
with set-key
, get-key
, delete-key
, list-keys
--no-keyring
flaguse_keyring
parameterFAQs
Securely load and manage encrypted environment variables
We found that encrypted-env-loader demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Socket now supports Scala and Kotlin, bringing AI-powered threat detection to JVM projects with easy manifest generation and fast, accurate scans.
Application Security
/Security News
Socket CEO Feross Aboukhadijeh and a16z partner Joel de la Garza discuss vibe coding, AI-driven software development, and how the rise of LLMs, despite their risks, still points toward a more secure and innovative future.
Research
/Security News
Threat actors hijacked Toptal’s GitHub org, publishing npm packages with malicious payloads that steal tokens and attempt to wipe victim systems.