georgemarshall / django-cryptography

Easily encrypt data in Django
https://django-cryptography.readthedocs.io/
BSD 3-Clause "New" or "Revised" License
371 stars 70 forks source link

Support for rotation of secrets #36

Open StephanErb opened 4 years ago

StephanErb commented 4 years ago

Hi everyone,

we accidentally leaked the SECRET_KEY of a test environment that was used for decrypting model fields using this library. In such a case, to be on the safe side, one has to rotate the leaked key. While I am aware that we can run a migration similar to this one here it would be great if django-cryptography would has an officially supported way how to rotate encryption keys:

Proposal A) Ship a Django command to perform such a secret rotation:

$ django-admin rotate_encryption_key <current secret key> <new secret key> 

Afterwards the settings.py needs to be adjusted to reference the new key.

Proposal B) If Proposal A is hard to implement, an easier but less secure alternative option would be to support two kinds of secret specifications:

In case a field cannot be decrypted using either SECRET_KEY or CRYPTOGRAPHY_KEY all secrets in CRYPTOGRAPHY_PREVIOUS_KEYS are tried in order. This would enable us to at lest have all new secrets encrypted with a new key, while the encryption of other fields is still supported.

Thanks!

thismatters commented 3 years ago

I would think that Proposal A is the easiest to adopt!

rj76 commented 3 years ago

I would love to see this integrated :)

thismatters commented 3 years ago

@StephanErb It would seem reasonable to also support changing the salt. What do you think?

zaeem-maqsood commented 2 years ago

Has there been any progress on this feature? Or supporting multiple keys for decryption?

thismatters commented 2 years ago

@zaeem-maqsood I don't think a PR has been put forward for rotating keys.