Skip to main content

Helps rotating your secret keys safely without losing user sessions, which means without logging users out.

Compatible with modern Django versions. At the moment of writing that’s including 1.11 and 2.0 on Python 3.7.

I haven’t found any library to allow us to do this on our production website, so I started the library.

Problem

Once you change the SECRET_KEY on production, all the old sessions and cookies are invalidated, users are logged out and data in sessions are lost.

This is good if your SECRET_KEY is compromised! But not good if you just want to rotate in a regular schedule for security purposes.

This library allows you to continue supporting old sessions signed with your old secret key, while rewriting them with the new secret key if the user comes to the website.

So optimal schedule would be

  • you decide to rotate your secret key

  • Install django-rotate-secret-key and configure

  • Support both keys for a limited time (x months)

  • Roll back django-rotate-secret-key and keep your secret key the same (removing the old one)

If a user comes back to the website after x months, his session will be invalidated. But for all the regular users this should be seamless transition.

Compatibility

If you are using JWT tokens created by django-rest-framework-jwt, currently package is not compatible. But it will be supported in version 1.0.

Getting It

$ pip install django-rotate-secret-key

Installing It

This is safe to do even before you decide to rotate your keys, it basically has no effect before you change the settings.:

INSTALLED_APPS = (
    ...
    'rotatesecretkey',
    ...
)

Settings

Replace AuthenticationMiddleware with RotateAuthenticationMiddleware:

MIDDLEWARE = [
    ...
    # 'django.contrib.auth.middleware.AuthenticationMiddleware',
    'rotatesecretkey.middleware.RotateAuthenticationMiddleware',
    ...
]

Replace SESSION_ENGINE:

SESSION_ENGINE = 'rotatesecretkey.sessions'

Add the old secret key into OLD_SECRET_KEY, and create a new SECRET_KEY.:

SECRET_KEY = 'NEWRANDOMKEY'
OLD_SECRET_KEY = 'your_previous_secret_key_that_you_want_to_support'

Once these changes go live your website will decode old sessions with the OLD_SECRET_KEY and resign them with the new SECRET_KEY.

After some time (like 1 or 2 months) you should roll these changes back and just keep the SECRET_KEY.:

SECRET_KEY = 'NEWRANDOMKEY'

You don’t want to support OLD_SECRET_KEY forever but long enough to give your visitors a chance to visit the website and rewrite their sessions with the new key.

Metadata

Release files for django-rotate-secret-key 0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-rotate-secret-key 0.3
File Size Uploaded
django-rotate-secret-key-0.3.tar.gz 3.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-rotate-secret-key 0.3
File Interpreter ABI Platform
django_rotate_secret_key-0.3-py3-none-any.whl Python 3 none any Details

Total release size: 9.4 kB

Release files / django-rotate-secret-key-0.3.tar.gz

Download URL django-rotate-secret-key-0.3.tar.gz
Size 3.9 kB
Tags Source
SHA-256 checksum
How to use checksums
9da44de619567a9a12364eca2cd007d61e74ad110ef04a5f87b56db122ff2749
BLAKE2b-256 checksum
How to use checksums
d291beb9a5aecb740546d020779ec14a8bbcf496072e4653800c03a719d21073
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.12.1 pkginfo/1.5.0.1 requests/2.20.0 setuptools/40.5.0 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.7.1

Release files / django_rotate_secret_key-0.3-py3-none-any.whl

Download URL django_rotate_secret_key-0.3-py3-none-any.whl
Size 5.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e1948aef8d9cb2d4731235d44e9af15765e9258b1e486c2f2faa0c2ff0484074
BLAKE2b-256 checksum
How to use checksums
de3c9515ce83cc5804607993e372410b2a1d8ddf57cea6eaa27ad275d9b92edb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.12.1 pkginfo/1.5.0.1 requests/2.20.0 setuptools/40.5.0 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.7.1

Release history Release notifications | RSS feed

This release

0.3 This release

2 release files

0.2

3 release files

0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page