Недостатки динамического SECRET_KEY в Django
Я только начал изучать Django и мне интересно, какие недостатки могут быть у использования случайно сгенерированного SECRET-KEY. Пока что я начал с использования этого кода...
from pathlib import Path import random, string
# Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/
# Randomized security key size = 100 SECRET_KEY = ''.join(random.choices(string.ascii_uppercase + string.ascii_lowercase
+ string.punctuation + string.hexdigits + string.digits, k = size))
На данный момент это, кажется, хорошо работает для простого блога, который я сделал, но мне интересно, какие недостатки это может иметь в других случаях и есть ли лучшие способы сделать ключ безопасным.
Заранее спасибо!
Вам действительно следует использовать секретный ключ случайной генерации, но он не должен генерироваться динамически в настройках, так как ротация ключа аннулирует активные сессии, сообщения и токены. Из документации:
Секретный ключ используется для:
- Всех сессий, если вы используете любой другой бэкенд сессий, кроме django.contrib.sessions.backends.cache, или используете по умолчанию get_session_auth_hash().
- Все сообщения, если вы используете CookieStorage или FallbackStorage.
- Все PasswordResetView tokens.
- Любое использование криптографической подписи, если не предоставлен другой ключ.
Если вы измените свой секретный ключ, все вышеперечисленные действия будут недействительны. Секретные ключи не используются для паролей пользователей, и поворот ключа не не влияет на них.
Примечание: Не используйте random.choices()
для генерации секретного ключа, так как он не является криптографически безопасным. Для этого можно использовать модуль secrets:
import secrets
import string
choices = string.ascii_letters + string.digits + "<>()[]*?@!#~,.;"
key = "".join(secrets.choice(choices) for n in range(100))