Skip to main content

Field-level encryption for Django using AES-256-GCM

Project description

django-field-encryption

Field-level and file encryption for Django using AES-256-GCM with automatic key rotation support.

Features

  • Field-level encryption: Encrypt sensitive data in Django model fields
  • File encryption: Encrypt uploaded files with dedicated storage backend
  • Automatic key rotation: Seamlessly rotate encryption keys without data migration
  • Key derivation: Separate keys for fields and files using HKDF
  • Tamper detection: AES-GCM provides built-in authentication
  • Multiple key support: Manage multiple encryption key versions

Installation

pip install django-field-encryption

Quick Start

  1. Add to your Django settings:
DATA_PROTECTION_KEYS = {
    'v1': 'your-base64-encoded-32-byte-key',
}
DATA_PROTECTION_ACTIVE_KEY_ID = 'v1'
  1. Use the encrypted fields:
from django_field_encryption import EncryptedCharField, EncryptedTextField

class MyModel(models.Model):
    secret_name = EncryptedCharField(max_length=100)
    secret_notes = EncryptedTextField()

Configuration

Generate a Master Key

from django_field_encryption import generate_master_key

key = generate_master_key()  # Returns base64-encoded 32-byte key

Multiple Keys and Key Rotation

DATA_PROTECTION_KEYS = {
    'v1': 'old-key-base64...',
    'v2': 'new-key-base64...',
}
DATA_PROTECTION_ACTIVE_KEY_ID = 'v2'

When rotating to a new key, existing encrypted data can be re-encrypted:

from django_field_encryption import FieldEncryptor

# Re-encrypt with the active key
rotated_value = FieldEncryptor.rotate_value(old_encrypted_value)

Field Types

EncryptedCharField

Encrypted character field stored as TextField:

from django_field_encryption import EncryptedCharField

class UserProfile(models.Model):
    ssn = EncryptedCharField(max_length=20)
    credit_card = EncryptedCharField(char_max_length=16)

EncryptedTextField

Encrypted text field for longer content:

from django_field_encryption import EncryptedTextField

class Document(models.Model):
    content = EncryptedTextField()
    private_notes = EncryptedTextField()

EncryptedJSONField

Encrypted JSON field with automatic serialization:

from django_field_encryption import EncryptedJSONField

class Settings(models.Model):
    preferences = EncryptedJSONField()
# Usage
obj = MyModel.objects.create(
    preferences={'theme': 'dark', 'notifications': True}
)
# Automatically serialized, encrypted, and stored

File Encryption

EncryptedFileStorage

Use the encrypted file storage for sensitive file uploads:

from django_field_encryption import EncryptedFileStorage
from django.db import models

class Document(models.Model):
    file = models.FileField(storage=EncryptedFileStorage())

Or use the pre-configured instance:

from django_field_encryption import encrypted_file_storage

class Document(models.Model):
    file = models.FileField(storage=encrypted_file_storage)

API Reference

FieldEncryptor

Low-level encryption/decryption operations:

from django_field_encryption import FieldEncryptor

# Encrypt
encrypted = FieldEncryptor.encrypt('sensitive data')
# Returns: 'v1:base64encoded...'

# Decrypt
decrypted = FieldEncryptor.decrypt(encrypted)
# Returns: 'sensitive data'

# Check if value is encrypted with a known key
can_decrypt = FieldEncryptor.can_decrypt(encrypted)  # True/False

# Rotate to active key
rotated = FieldEncryptor.rotate_value(encrypted)
# Returns re-encrypted value or None if already using active key

# Clear key cache (call after changing settings in tests)
FieldEncryptor.clear_cache()

FileEncryptor

File-level encryption:

from django_field_encryption import FileEncryptor

# Encrypt bytes
encrypted, key_id = FileEncryptor.encrypt(b'sensitive file content')
# Returns: (b'ENC2...', 'v1')

# Decrypt
decrypted = FileEncryptor.decrypt(encrypted)
# Returns: b'sensitive file content'

# Check if data is encrypted
is_enc = FileEncryptor.is_encrypted(encrypted)  # True/False

compute_hash

Compute a deterministic hash for indexing (without encryption):

from django_field_encryption import compute_hash

hash_value = compute_hash('29901012345678')
# Returns: 64-character hex string

generate_master_key

Generate a cryptographically secure master key:

from django_field_encryption import generate_master_key

key = generate_master_key()
# Returns: base64-encoded 32-byte key

Configuration Functions

from django_field_encryption import (
    get_keys_config,
    get_active_key_id,
    get_master_key,
)

keys = get_keys_config()          # Returns dict of key_id -> key
active_key = get_active_key_id()  # Returns currently active key_id
master_key = get_master_key('v1') # Returns raw 32-byte key for key_id

Security Notes

  • Keys are 32 bytes (256 bits) for AES-256
  • Uses AES-GCM (Galois/Counter Mode) for authenticated encryption
  • Each encryption generates a unique 12-byte nonce
  • Field and file keys are derived separately using HKDF
  • The library does not encrypt at rest - data is encrypted/decrypted in memory only

License

MIT

Project details


Download files

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

Source Distribution

django_field_encryption-0.1.2.tar.gz (10.0 kB view details)

Uploaded Source

Built Distribution

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

django_field_encryption-0.1.2-py3-none-any.whl (9.7 kB view details)

Uploaded Python 3

File details

Details for the file django_field_encryption-0.1.2.tar.gz.

File metadata

  • Download URL: django_field_encryption-0.1.2.tar.gz
  • Upload date:
  • Size: 10.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.11

File hashes

Hashes for django_field_encryption-0.1.2.tar.gz
Algorithm Hash digest
SHA256 a45bb5f609d9f66d8f9f1cbd2fb4ffd0bd67914fc005e391f01248cf71a2d688
MD5 dd28f6661e7c5fa1a0ae7e41c5666843
BLAKE2b-256 ff3666fe45a8ad6bbb8503fd9e5bad24c0b9449f4491e4c8ece3a63dd719b228

See more details on using hashes here.

File details

Details for the file django_field_encryption-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for django_field_encryption-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 213b1a8999025ad132889f6d1dd7c25bfd75060792d804bd281ec273aedc4553
MD5 11a13081dd7fda2496d1f91db79eb5fc
BLAKE2b-256 e3adf9705648fbed4f294ee0e1fcdd55aa08f49b786f9a12c3051c19c2b5bd1a

See more details on using hashes here.

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