Призначення параметра "Джанго" "SECRET_KEY"


157

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

Наприклад, що могло статися, якщо ключ був скомпрометований / інші знали, що це таке? Дякую.


4
Якщо у вас є секретний ключ, а він компрометований і виданий іншим, у вас є проблема. Не має значення, використовуєте ви Джанго чи ні.
Джаред Фарріш

35
Але яка проблема саме?
тобіч

7
Я зробив ретельний відповідь тут , (безсоромний штепсель)
sberder

4
@sberder Можливо, ви також повинні написати відповідь на це питання. Я думаю, ти міг би зробити це набагато краще, ніж прийнятий невідповідь.
kasperd

Відповіді:


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, не пояснюючи, що робить що-небудь з цього. Де відповідь на питання "що може статися, якщо ключ буде порушений?"?
kasperd

Крім того, оскільки SECRET_KEY є конфіденційним, префіксація ключа SECRET до ключа гарантує, що Django буде шифрувати / маскувати значення, коли це потрібно.
Linus_30

36

Документація Django для підписання криптовалют охоплює використання параметра "SECRET_KEY":

Це значення [ SECRET_KEYналаштування] є ключовим у захисті підписаних даних - важливо, щоб ви зберігали цю безпеку, або зловмисники могли використовувати її для створення власних підписаних значень.

(Цей розділ також посилається в документації Django для налаштування "SECRET_KEY" .)

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

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

  • Унікальні жетони для сеансу користувача, запит на скидання пароля, повідомлення тощо.

  • Запобігання крос-сайтів або повторна атака шляхом додавання (а потім очікування) унікальних значень для запиту.

  • Створення унікальної солі для хеш-функцій.

Отже, загальна відповідь така: У додатку Django є багато речей, для яких потрібен криптографічний підпис, а для цього використовується ключ "SECRET_KEY". Він повинен мати криптографічно велику кількість ентропії (важко здогадатися комп'ютерам) та унікальної між усіма примірниками Django.


1
"і унікальний між усіма примірниками Django." - чи означає це, якщо сказати, що за балансиром завантаження у мене є 3 веб-сервери, які працюють за тим самим додатком Django, у мене повинні бути 3 різних SECRET_KEYналаштування?
Адам Паркін

2
@AdamParkin, це здається гарним початком нового питання , щоб отримати власну відповідь.
bignose

2
Прекрасна пропозиція, зроблено: stackoverflow.com/questions/51657422/…
Адам Паркін

19

Відповідно до Документації Джанга про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.