Objetivo da configuração do Django 'SECRET_KEY'

157

Qual é exatamente o ponto do SECRET_KEYdjango? Fiz algumas pesquisas no Google e verifiquei os documentos ( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key ), mas estava procurando uma explicação mais detalhada sobre isso, e por que é necessário.

Por exemplo, o que poderia acontecer se a chave estivesse comprometida / outros soubessem o que era? Obrigado.

David542
fonte
4
Se você possui uma chave secreta e ela é comprometida e liberada para outras pessoas, você tem um problema. Não importa se você está usando o Django ou não.
Jared Farrish
35
Mas que problema exatamente?
tobych
7
Fiz uma resposta completa aqui (plug descarado)
sberder
4
@berder Talvez você também deva escrever uma resposta para esta pergunta. Eu imagino que você poderia fazer isso muito melhor do que a não resposta aceita.
kasperd

Respostas:

92

É usado para fazer hashes. Veja:

>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()
Roshan Mathews
fonte
9
Por que eles não chamaram de sal então? ;)
datenwolf 15/06
29
Isso é um palpite, mas suponho que seja mais fácil dizer às pessoas "não compartilham o seu SECRET_KEY", em oposição a "sua SALTé uma chave secreta que você deve guardar para si mesmo".
Roshan Mathews
12
Essa distinção é muito importante. Na criptografia, os sais não são secretos, mas SECRET_KEYdevem ser mantidos em segurança. O uso do SECRET_KEYé muito mais parecido com o uso de uma chave em um hash assinado, como o HMAC (que, se o desempenho não fosse uma consideração, provavelmente seria usado).
Travis Jensen
32
Isso não parece uma resposta para mim. Tudo o que você fez foi um único comando grep sem explicar o que ele faz. Onde está a resposta para "o que poderia acontecer se a chave fosse comprometida?"?
kasperd
Além disso, como o SECRET_KEY é confidencial, o prefixo de SECRET à chave garante que o Django criptografe / oculte os valores sempre que necessário.
Linus_30
36

A documentação do Django para assinatura criptográfica cobre os usos da configuração 'SECRET_KEY':

Esse valor [a SECRET_KEYconfiguração] é a chave para proteger os dados assinados - é vital mantê-lo seguro, ou os invasores podem usá-lo para gerar seus próprios valores assinados.

(Esta seção também é referenciada na documentação do Django para a configuração 'SECRET_KEY' .)

A API de assinatura criptográfica no Django está disponível para qualquer aplicativo para assinaturas criptograficamente seguras em valores. O próprio Django faz uso disso em vários recursos de nível superior:

  • Assinatura de dados serializados (por exemplo, documentos JSON).

  • Tokens exclusivos para uma sessão do usuário, solicitação de redefinição de senha, mensagens etc.

  • Prevenção de ataques entre sites ou de reprodução adicionando (e depois esperando) valores exclusivos para a solicitação.

  • Gerando um sal exclusivo para funções de hash.

Portanto, a resposta geral é: Existem muitas coisas em um aplicativo Django que requerem uma assinatura criptográfica, e a configuração 'SECRET_KEY' é a chave usada para isso. Ele precisa ter uma quantidade criptograficamente forte de entropia (difícil para os computadores adivinharem) e única entre todas as instâncias do Django.

nariz grande
fonte
1
"e único entre todas as instâncias do Django." - isso implica que, digamos que eu tenha 3 servidores da web executando o mesmo aplicativo Django atrás de um balanceador de carga, eu deveria ter 3 SECRET_KEYconfigurações distintas ?
Adam Parkin
2
@ AdamParkin, isso parece um bom começo para uma nova pergunta , para obter sua própria resposta.
precisa saber é
2
Ótima sugestão, feito: stackoverflow.com/questions/51657422/...
Adam Parkin
19

De acordo com a documentação do Django sobreSECRET_KEY :

A chave secreta é usada para:

  • Todas as sessões, se você estiver usando outro back-end de sessão django.contrib.sessions.backends.cacheou se estiver usando o padrão get_session_auth_hash().
  • Todas as mensagens se você estiver usando CookieStorageou FallbackStorage.
  • Todos os tokens PasswordResetView.
  • Qualquer uso de assinatura criptográfica, a menos que uma chave diferente seja fornecida.

Se você girar sua chave secreta, todos os itens acima serão invalidados. Chaves secretas não são usadas para senhas de usuários e a rotação de chaves não as afetará.

Michael B
fonte
5
Informações úteis sobre o que acontece se o SECRET_KEYrodar. +1
Hassan Baig