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

157

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

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

David542
источник
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
Хасан