Изменить: Этот ответ основан на Django 1,5
SECRET_KEY
используется во многих различных местах, я сначала укажу, на что это влияет, а затем попробую просмотреть этот список и дать точное объяснение воздействия.
Список вещей, использующих SECRET_KEY
прямо или косвенно:
На самом деле очень много пунктов , перечисленных здесь , используют SECRET_KEY
через django.utils.crypt.get_random_string()
который использует его для семян случайного двигателя. На это не повлияет изменение стоимости SECRET_KEY
.
Пользовательский опыт, непосредственно затронутый изменением значения:
- сеансах, декодирование данных будет прервано, что справедливо для любого сеанса бэкэнда (куки, база данных, файл или кеш).
- уже отправленный токен для сброса пароля не будет работать, пользователям придется запросить новый.
- Форма комментариев (если используется
django.contrib.comments
) не будет проверена, если она была запрошена до изменения значения и отправлена после изменения значения. Я думаю, что это очень незначительно, но может сбить пользователя с толку.
- messages (from
django.contrib.messages
) не будет проверять серверную часть в тех же временных условиях, что и для формы комментариев.
ОБНОВЛЕНИЕ : теперь работает над django 1.9.5, быстрый взгляд на источник дает мне почти такие же ответы. Могу сделать тщательный осмотр позже.
data decode will break
и, возможно, указать какой-нибудь код (в django или в примере проекта), который сломается? РЕДАКТИРОВАТЬ: по-прежнему использовать Django 1.4 - это так?SECRET_KEY
используютсяsalted_hmac
для хеширования данных сеанса.<algorithm>$<iterations>$<salt>$<hash>
в AUTH_USER, поэтому случайная соль хранится вместе с паролем в каждом конкретном случае.Поскольку этот вопрос был задан, документация по Django была изменена и теперь содержит ответ.
Мне не было ясно, как именно я должен повернуть секретный ключ. Я нашел обсуждение того, как Django генерирует ключ для нового проекта , а также Gist, в котором обсуждаются другие варианты . В конце концов я решил просто заставить Django создать новый проект, скопировать новый секретный ключ в мой старый проект, а затем стереть новый проект .
Обновить
Похоже, Django добавил
get_random_secret_key()
функцию в версии 1.10. Вы можете использовать это для генерации нового секретного ключа.источник
startproject
, вы увидите, что он просто генерирует случайную строку, используяcrypto
модуль.Согласно этой странице https://docs.djangoproject.com/en/dev/topics/signing/ , SECRET_KEY в основном используется для временных вещей - для подписи данных, отправляемых по проводам, например, для обнаружения подделки. Похоже, вещи, которые могут сломаться:
Кто-то с более недавним и / или заметным опытом Django, чем я, может вмешаться в другие, но я подозреваю, что если вы явно не делаете что-то с API подписи, это должно только создать легкое неудобство для ваших пользователей.
источник
Строка SECRET_KEY в основном используется для шифрования и / или хеширования данных cookie. Многие фреймворки (включая Django) приходят к этому, так как куки-файлы сеансов по умолчанию имеют свои недостатки.
Представьте, что у вас есть форма в django для редактирования статей со скрытым полем. В этом скрытом поле хранится идентификатор статьи, которую вы редактируете. И если вы хотите быть уверены, что никто не сможет отправить вам какой-либо другой идентификатор статьи, вы добавите дополнительное скрытое поле с хешированным идентификатором. Так что, если кто-то изменит идентификатор, вы узнаете об этом, потому что хэш не будет таким же.
Конечно, это тривиальный пример, но именно так используется SECRET_KEY.
Django внутренне использует его, например, для {% csrf_token%} и еще нескольких вещей. Это действительно не должно иметь никакого влияния на ваше приложение, если вы измените его, исходя из вашего вопроса и того, что вы его не используете.
Единственное, что, возможно, значения сессии будут отброшены. Так, например, пользователям придется снова войти в администратор, потому что django не сможет декодировать сеанс с другим ключом.
источник
Я сделал эту же ошибку. Пароль по умолчанию был длиной 50, поэтому я использовал powershell для генерации случайной строки длиной 50 и заменил на нее старый SECRET_KEY. Я вошел в систему и после замены SECRET_KEY мой предыдущий сеанс был признан недействительным.
С Powershell ( источник ):
С Bash ( источник ):
В этот момент я подумал, почему бы не попробовать больший ключ, поэтому я попробовал его с ключом длиной 100 и 1000. Оба работали. Если я понимаю исходный код , объект, возвращаемый функцией подписи, является хэшем hmac в base64. RFC 2104 имеет это сказать для требуемой длины секретного ключа HMAC.
Чтобы перевести на обычную речь, размер секретного ключа должен совпадать с размером вывода. Ключ также должен быть в битах. Каждая цифра в base64 представляет 6 бит. Таким образом, если бы у вас был пароль из 50 символов, у вас был бы секретный ключ 50 x 6 = 300 бит. Если вы используете SHA256, то вам потребуется ключ 256 бит ( sha256 использует 256 бит по определению ). Таким образом, пароль длиной 50 должен работать, если вы не планируете использовать алгоритм хеширования больше, чем SHA256.
Но так как все дополнительные биты в ключе хэшируются, его размер не сильно снижает производительность. Но это гарантирует, что у вас достаточно битов для больших хеш-функций. SHA-512 будет охвачен длиной SECRET_KEY длиной 100 ( 50 x 6 = 600 бит> 512 бит ).
источник