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.3-cp310-abi3-win_amd64.whl (518.6 kB view details)

Uploaded CPython 3.10+Windows x86-64

dotenvage-0.3.3-cp310-abi3-manylinux_2_39_x86_64.whl (739.5 kB view details)

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

dotenvage-0.3.3-cp310-abi3-manylinux_2_39_aarch64.whl (709.6 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.39+ ARM64

dotenvage-0.3.3-cp310-abi3-macosx_11_0_arm64.whl (651.6 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

dotenvage-0.3.3-cp310-abi3-macosx_10_12_x86_64.whl (675.3 kB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: dotenvage-0.3.3-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.3-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 a64e9c81ade23179f091a5342e10d88735fbd59d2bfa9e37990f7caff6f8efc9
MD5 18ada291fe165f7df007d4050a52c47f
BLAKE2b-256 9562c25f271a09d4d0a201e0eaa6e8002ba726d19789fa191d0c60c3d791de09

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.3.3-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.3-cp310-abi3-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for dotenvage-0.3.3-cp310-abi3-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 20eaaa6dcf8dc1e927ded500b176a6510a26acd02fb7ce7fdecf373be3dab59c
MD5 3cbd35976166fc05925bbb84728d094e
BLAKE2b-256 afe200b53a52f6bfcf2442c4294590ec46a94784c95ccf9b538cfab6afc2aba3

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.3.3-cp310-abi3-manylinux_2_39_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.3-cp310-abi3-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for dotenvage-0.3.3-cp310-abi3-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 a745cd07d3b56d58135f6b4e1499b576b564a0c5d073e4e0ba3244e2f5177c73
MD5 24d3c8a538f5ba50909e75e937df214d
BLAKE2b-256 3b043b897c3e178de688b89de194b4b24cebbdda8338447442dd233ebaa3439c

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.3.3-cp310-abi3-manylinux_2_39_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.3-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dotenvage-0.3.3-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 621c50b30bb7f65b0f93d73d92cf57b21061e3cb1a8a75dd8319b4c134a6cf28
MD5 b5415a2bebb61124f08129ada2a29390
BLAKE2b-256 a343cb431c15251ce46dcc79e5103bec70b440767cd3f84c51a1a2b1b617028f

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.3.3-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.3-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for dotenvage-0.3.3-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e4dbb014c8aacc0d002185da8b9b9ee4adc0573491927ed31a7a12c5b16aec10
MD5 a3cbf3f4ad6e0af50603fd803cf8c995
BLAKE2b-256 a41fae01ba46e0440782d79fa994ebaadbc2be25c8d1f68e812a6fc17072343c

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.3.3-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