Цель настройки Django 'SECRET_KEY'


157

Какой именно смысл SECRET_KEYв Джанго? Я сделал несколько поисков в Google и проверил документы ( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key ), но я искал более подробное объяснение этого, и почему это требуется.

Например, что могло произойти, если ключ был взломан / другие знали, что это было? Спасибо.


4
Если у вас есть секретный ключ, и он скомпрометирован и передан другим, у вас есть проблема. Неважно, используете ли вы Django или нет.
— Джаред Фарриш

35
Но какая именно проблема?
— тобыч

7
Я сделал полный ответ здесь (бесстыдная заглушка)
— Сбердер

4
@sberder Может быть, вам стоит написать ответ и на этот вопрос. Я полагаю, вы могли бы сделать это намного лучше, чем принятый не ответ.
— Касперд

Ответы:


92

Используется для изготовления хешей. Смотреть:

>grep -Inr SECRET_KEY *
conf/global_settings.py:255:SECRET_KEY = ''
conf/project_template/settings.py:61:SECRET_KEY = ''
contrib/auth/tokens.py:54:        hash = sha_constructor(settings.SECRET_KEY + unicode(user.id) +
contrib/comments/forms.py:86:        info = (content_type, object_pk, timestamp, settings.SECRET_KEY)
contrib/formtools/utils.py:15:    order, pickles the result with the SECRET_KEY setting, then takes an md5
contrib/formtools/utils.py:32:    data.append(settings.SECRET_KEY)
contrib/messages/storage/cookie.py:112:        SECRET_KEY, modified to make it unique for the present purpose.
contrib/messages/storage/cookie.py:114:        key = 'django.contrib.messages' + settings.SECRET_KEY
contrib/sessions/backends/base.py:89:        pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest()
contrib/sessions/backends/base.py:95:        if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
contrib/sessions/backends/base.py:134:        # Use settings.SECRET_KEY as added salt.
contrib/sessions/backends/base.py:143:                       settings.SECRET_KEY)).hexdigest()
contrib/sessions/models.py:16:        pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest()
contrib/sessions/models.py:59:        if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
core/management/commands/startproject.py:32:        # Create a random SECRET_KEY hash, and put it in the main settings.
core/management/commands/startproject.py:37:        settings_contents = re.sub(r"(?<=SECRET_KEY = ')'", secret_key + "'", settings_contents)
middleware/csrf.py:38:                % (randrange(0, _MAX_CSRF_KEY), settings.SECRET_KEY)).hexdigest()
middleware/csrf.py:41:    return md5_constructor(settings.SECRET_KEY + session_id).hexdigest()

9
Почему тогда они не назвали это солью? ;)
— datenwolf

29
Это предположение, но я полагаю, что людям легче сказать «не делись своими SECRET_KEY», а не «ваш SALTсекретный ключ, который вы должны хранить при себе».
— Рошан Мэтьюз

12
Это различие очень важно. В криптографии соли не являются секретом, но SECRET_KEYдолжны храниться в безопасности. Использование SECRET_KEYгораздо более похоже на использование ключа в хеше со знаком, таком как HMAC (который, если бы производительность не учитывалась, вероятно, вместо этого использовался бы).
— Трэвис Дженсен

32
Это не похоже на ответ для меня. Все, что вы сделали, - это одна команда grep, не объясняя, что она делает. Где ответ на вопрос «что может произойти, если ключ будет взломан?»?
— Касперд

Также, поскольку SECRET_KEY является конфиденциальным, добавление SECRET к ключу гарантирует, что Django будет шифровать / маскировать значения там, где это необходимо.
— Linus_30

36

Документация Django для криптографической подписи охватывает использование параметра 'SECRET_KEY':

Это значение [ SECRET_KEYпараметр] является ключом к защите подписанных данных - крайне важно, чтобы вы сохранили это в безопасности, иначе злоумышленники могут использовать его для создания своих собственных подписанных значений.

(Этот раздел также упоминается в документации Django для настройки 'SECRET_KEY' .)

API криптографического подписывания в Django доступен для любого приложения для криптографически защищенных подписей значений. Сам Django использует это в различных высокоуровневых функциях:

  • Подписание сериализованных данных (например, документов JSON).

  • Уникальные токены для сеанса пользователя, запроса на сброс пароля, сообщений и т. Д.

  • Предотвращение межсайтовых или повторных атак путем добавления (а затем и ожидания) уникальных значений для запроса.

  • Генерация уникальной соли для хэш-функций.

Итак, общий ответ таков: в приложении Django есть много вещей, для которых требуется криптографическая подпись, и параметр SECRET_KEY - это ключ, используемый для них. Он должен иметь криптографически сильную энтропию (трудно угадать для компьютеров) и уникальную для всех экземпляров Django.


1
«и уникален между всеми экземплярами Django». - это означает, что если у меня есть 3 веб-сервера, на которых запущено одно и то же приложение Django за балансировщиком нагрузки, у меня должно быть 3 различных SECRET_KEYпараметра?
— Адам Паркин

2
@ AdamParkin, звучит как хорошее начало для нового вопроса , чтобы получить свой ответ.
— bignose

2
Отличное предложение, сделано: stackoverflow.com/questions/51657422/…
— Адам Паркин

19

Согласно документации Django оSECRET_KEY :

Секретный ключ используется для:

  • Все сеансы, если вы используете какой-либо другой сеанс, кроме django.contrib.sessions.backends.cacheиспользуемого по умолчаниюget_session_auth_hash() .
  • Все сообщения, если вы используете CookieStorageилиFallbackStorage .
  • Все токены PasswordResetView.
  • Любое использование криптографической подписи, если не предоставлен другой ключ.

Если вы поверните свой секретный ключ, все вышеперечисленное будет признано недействительным. Секретные ключи не используются для паролей пользователей, и ротация ключей не повлияет на них.


5
Полезная информация о том, что произойдет, если SECRET_KEYповернуть. +1
— Хасан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.