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

Uploaded CPython 3.10+Windows x86-64

dotenvage-0.6.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (680.4 kB view details)

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

dotenvage-0.6.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (642.9 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

dotenvage-0.6.3-cp310-abi3-macosx_11_0_arm64.whl (678.8 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

dotenvage-0.6.3-cp310-abi3-macosx_10_12_x86_64.whl (697.7 kB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for dotenvage-0.6.3-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 dd8e74be46218fb6a44ca6cd61ecd4ad4ba6d123277ac724b6daeedda0d1edc0
MD5 6260e4fcf16baf92f1808396d46469f7
BLAKE2b-256 16c853504328cbfdd48826f1c735e3430567e2c81ac2e0d599356cd8660cd81c

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.6.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.6.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for dotenvage-0.6.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9a9bdae9f1675cdc1abb979710f906f5e2da53927a1e51000e7bc9187d47859b
MD5 b057330f7bf505a0e1afad7caed7785c
BLAKE2b-256 027717aa1a6f6ffb1c39177e9f6d447d2b019caf55e885d7e16bf86b73c69278

See more details on using hashes here.

Provenance

The following attestation bundles were made for dotenvage-0.6.3-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.6.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for dotenvage-0.6.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 64a4e4086af56b69435b3ae042f57de04581b32a2ab70f66b46b39566c77ed23
MD5 4c258e0b29ce70ed9cda6f03c2967f27
BLAKE2b-256 12e4865815eddb4f26628dd459c27f74377355655a1c3979bbb12f94d2766837

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for dotenvage-0.6.3-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 003fb2f3f05fc1e7639265bf82f112e3419eee846ff175d36a5b52842ce17b90
MD5 3c3a0d853a6bf3b12d2f475cc82b0e6c
BLAKE2b-256 92d47ba75f7f09325beee9215b7927a75a102d141ce0ed17e30c1414f2f295cd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for dotenvage-0.6.3-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 62b3243d953eb32741a7d9288eec096ee5190f951cb1dc6ee31fb1e4c5ce1483
MD5 f1bad252666aded56cb4523c4700aa3b
BLAKE2b-256 996103f4b8241fe744d9ad861a8440f62c284e49234afb20bd1f059fb8829738

See more details on using hashes here.

Provenance

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