Skip to main content

Python bindings for dotenvage - encrypt secrets in .env files using age encryption

Project description

dotenvage

Python bindings for dotenvage — encrypt secrets in .env files using age encryption (X25519).

Installation

pip install dotenvage
# or with uv
uv add dotenvage

Quick start

import dotenvage

# Generate a new identity (key pair)
manager = dotenvage.SecretManager.generate()
print(f"Public key: {manager.public_key_string()}")

# Encrypt a secret
encrypted = manager.encrypt_value("my-secret-password")
print(f"Encrypted: {encrypted}")
# Output: ENC[AGE:b64:...]

# Decrypt it back
decrypted = manager.decrypt_value(encrypted)
print(f"Decrypted: {decrypted}")
# Output: my-secret-password

# Check if a value is encrypted
print(dotenvage.SecretManager.is_encrypted(encrypted))  # True
print(dotenvage.SecretManager.is_encrypted("plain"))    # False

Loading .env files

import dotenvage

# Load .env files (decrypts encrypted values automatically)
loader = dotenvage.EnvLoader()
loaded_files = loader.load()
print(f"Loaded: {loaded_files}")

# Or get all variables as a dict
variables = loader.get_all_variables()
print(variables)

Auto-detection

dotenvage can detect which keys should be encrypted based on naming patterns:

import dotenvage

# Keys containing PASSWORD, SECRET, KEY, TOKEN, etc. are detected
dotenvage.should_encrypt("API_KEY")         # True
dotenvage.should_encrypt("DATABASE_URL")    # False
dotenvage.should_encrypt("SECRET_TOKEN")    # True

Key discovery

The SecretManager automatically discovers keys in this order:

  1. Auto-discover AGE_KEY_NAME from .env or .env.local files
  2. DOTENVAGE_AGE_KEY environment variable (full identity string)
  3. AGE_KEY environment variable
  4. EKG_AGE_KEY environment variable
  5. OS keychain entry (service: dotenvage or DOTENVAGE_KEYCHAIN_SERVICE; account: AGE_KEY_NAME or {CARGO_PKG_NAME}/dotenvage)
  6. Key file from AGE_KEY_NAME~/.local/state/{namespace}/{keyname}.key
  7. Default: ~/.local/state/dotenvage/dotenvage.key

OS keychain lookup currently uses:

  • macOS: Keychain via security
  • Linux/Unix: Secret Service via secret-tool
  • Windows: lookup falls back to file/env sources (no keychain lookup yet); keygen --store os|both stores using cmdkey

AGE_KEY_NAME format is {namespace}/{keyname}, e.g., myapp/production~/.local/state/myapp/production.key

API reference

SecretManager

Manager for encrypting and decrypting secrets using age encryption.

class SecretManager:
    def __init__(self) -> None:
        """Create from discovered key file."""

    @staticmethod
    def generate() -> SecretManager:
        """Generate a new random identity (key pair)."""

    @staticmethod
    def from_identity_string(identity: str) -> SecretManager:
        """Create from an age identity string (AGE-SECRET-KEY-...)."""

    @staticmethod
    def is_encrypted(value: str) -> bool:
        """Check if a value is in encrypted format."""

    def public_key_string(self) -> str:
        """Get public key as age1... string."""

    def encrypt_value(self, plaintext: str) -> str:
        """Encrypt to ENC[AGE:b64:...] format."""

    def decrypt_value(self, value: str) -> str:
        """Decrypt if encrypted, otherwise return unchanged."""

EnvLoader

Loader for .env files with automatic decryption.

class EnvLoader:
    def __init__(self) -> None:
        """Create with default SecretManager."""

    @staticmethod
    def with_manager(manager: SecretManager) -> EnvLoader:
        """Create with a specific SecretManager."""

    def load(self) -> list[str]:
        """Load .env files from current directory. Returns loaded paths."""

    def load_from_dir(self, dir: str) -> list[str]:
        """Load .env files from specific directory."""

    def get_all_variable_names(self) -> list[str]:
        """Get all variable names from .env files."""

    def get_all_variable_names_from_dir(self, dir: str) -> list[str]:
        """Get all variable names from .env files in directory."""

    def get_all_variables(self) -> dict[str, str]:
        """Load and return all variables as dict (decrypted)."""

    def get_all_variables_from_dir(self, dir: str) -> dict[str, str]:
        """Load and return all variables from directory (decrypted)."""

    def resolve_env_paths(self, dir: str) -> list[str]:
        """Get ordered list of .env file paths that would be loaded."""

Functions

def should_encrypt(key: str) -> bool:
    """Check if key name should be encrypted based on patterns."""

License

CC-BY-SA-4.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dotenvage-0.3.4-cp310-abi3-win_amd64.whl (518.6 kB view details)

Uploaded CPython 3.10+Windows x86-64

dotenvage-0.3.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (661.4 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

dotenvage-0.3.4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (619.0 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

dotenvage-0.3.4-cp310-abi3-macosx_11_0_arm64.whl (651.8 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

dotenvage-0.3.4-cp310-abi3-macosx_10_12_x86_64.whl (675.4 kB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file dotenvage-0.3.4-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: dotenvage-0.3.4-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 518.6 kB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for dotenvage-0.3.4-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 50f77d323258a029c49d4fa7f8ae5144b9e14f7e46f0053c9db0a261a8658929
MD5 abcd06b563eb0d0373bb7357d3504269
BLAKE2b-256 dc78d67be06016a8e4872b82937e3ff0fd9e4072afccab478a59ab2774d4fa56

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.3.4-cp310-abi3-win_amd64.whl:

Publisher: ci.yml on dataroadinc/dotenvage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dotenvage-0.3.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dotenvage-0.3.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2d1bc1155ffb07dd8bf8572db8b9e496b52de0da3473ab7fb2d9b83d2e93aafc
MD5 198220fa21d979b3a6c98302c5c1d108
BLAKE2b-256 5db92cf88cf4747907450180784ba17acd879068cd1cd254437aa069d20cc5b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.3.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on dataroadinc/dotenvage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dotenvage-0.3.4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dotenvage-0.3.4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 da5e93308dedb03b41a0a35f91e03e6f6af8778c2cfffc7a0b92fe137c2b2cbf
MD5 1a5a58348fd56f8607958dd8f93018d8
BLAKE2b-256 70ac5b8f135bee5893a206f88d061ca3bd62e390efe8d9940804ad5b47dfa352

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.3.4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: ci.yml on dataroadinc/dotenvage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dotenvage-0.3.4-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dotenvage-0.3.4-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f8518eba922efacb3629d687b4a62c0f9d8c4da392899679ad10f32696bb8fb7
MD5 eca2228154561cd44185f3f987b96a20
BLAKE2b-256 8187fde222a9803ae72f7c2f5e6987c62689fe4ea4678dc0206ad1c59c81a4db

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.3.4-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: ci.yml on dataroadinc/dotenvage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dotenvage-0.3.4-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for dotenvage-0.3.4-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c47b0970c70799105e060265b4f9520a2a0ebd17f53744bd06df615f877e1f26
MD5 b027e55897b648d2ae857adec42c514e
BLAKE2b-256 f93542e8d89f34e49a0e1a7beb719562cb5ee8e803a2b87f198a641a51201602

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.3.4-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: ci.yml on dataroadinc/dotenvage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page