Django 'SECRET_KEY' ayarının amacı


157

SECRET_KEYDjango'da anlamı tam olarak nedir ? Birkaç google araması yaptım ve dokümanları kontrol ettim ( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key ), ancak bunun daha ayrıntılı bir açıklamasını arıyordum, ve neden gerekli olduğu.

Örneğin, anahtarın güvenliği ihlal edilmişse / diğerleri bunun ne olduğunu biliyorsa ne olabilir? Teşekkür ederim.


4
Gizli bir anahtarınız varsa ve başkaları tarafından ele geçirilmiş ve serbest bırakılmışsa, bir sorununuz vardır. Django kullanıp kullanmadığınız önemli değil.
Jared Farrish

35
Ama tam olarak ne problemi?
tobych

7
Burada kapsamlı bir cevap verdim (utanmaz fiş)
sberder 14:13

4
@sberder Belki de bu soruya bir cevap yazmalısınız. Kabul edilen cevap vermekten çok daha iyi yapabileceğinizi düşünüyorum.
kasperd

Yanıtlar:


92

Karma yapmak için kullanılır. Bak:

>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
O zaman neden tuz demediler? ;)
datenwolf

29
Bu bir tahmindir, ancak sanırım insanlara "sizin paylaşmadığınızı" söylemenin daha kolay olduğunu SECRET_KEY, aksine " SALTkendinize saklamanız gereken gizli bir anahtardır."
Roshan Mathews

12
Bu ayrım çok önemlidir. Kriptografide tuzlar gizli değildir, ancak SECRET_KEYgüvenli tutulmaları gerekir. Kullanımı SECRET_KEYçok daha yakın böyle HMAC (performans bir göz olmasaydı, hangi muhtemelen yerine kullanılacaktır) olarak imzalı bir karmaya anahtarının kullanılması etmektir.
Travis Jensen

32
Bu bana bir cevap gibi görünmüyor. Tek yaptığınız, ne yaptığını açıklamadan tek bir grep komutuydu. "Anahtar ele geçirilirse ne olabilir?" Sorusunun cevabı nerede?
kasperd

Ayrıca SECRET_KEY gizli olduğu için, anahtara bir SECRET öneki eklenmesi, Django'nun gerektiğinde değerleri şifrelemesini / maskelemesini sağlar.
Linus_30

36

Kriptografik imzalama için Django belgeleri 'secret_key' ayarı kullanımlarını kapsamaktadır:

Bu değer [ SECRET_KEYayar] imzalı verileri korumanın anahtarıdır - bunu güvende tutmanız çok önemlidir veya saldırganlar bunu kendi imzalı değerlerini oluşturmak için kullanabilirler.

(Bu bölüm ayrıca 'SECRET_KEY' ayarı için Django belgelerinden de kaynaklanmaktadır .)

Django'daki şifreleme imzalama API'sı, değerlerde kriptografik olarak güvenli imzalar için herhangi bir uygulama tarafından kullanılabilir. Django, bunu çeşitli üst düzey özelliklerde kullanıyor:

  • Serileştirilmiş verileri imzalama (örn. JSON belgeleri).

  • Kullanıcı oturumu, şifre sıfırlama isteği, mesajlar vb. İçin benzersiz jetonlar.

  • İstek için benzersiz değerler ekleyerek (ve ardından bekleyerek) siteler arası veya tekrar saldırılarının önlenmesi.

  • Karma fonksiyonlar için benzersiz bir tuz üretmek.

Genel cevap şudur: Django uygulamasında kriptografik imza gerektiren birçok şey vardır ve 'SECRET_KEY' ayarı bunlar için kullanılan anahtardır. Kriptografik olarak güçlü bir entropi (bilgisayarların tahmin etmesi zor) ve tüm Django örnekleri arasında benzersiz olması gerekir.


1
"ve tüm Django örnekleri arasında benzersizdir." - Eğer bir yük dengeleyici arkasında aynı Django uygulamasını çalıştıran 3 web sunucuları varsa demek 3 farklı SECRET_KEYayarlara sahip olması gerekir mi?
Adam Parkin

2
@AdamParkin, yeni bir soru için kendi cevabını almak için iyi bir başlangıç ​​gibi görünüyor .
bignose

2
Harika bir öneri yapıldı: stackoverflow.com/questions/51657422/…
Adam Parkin

19

Django Belgelerine göreSECRET_KEY :

Gizli anahtar aşağıdakiler için kullanılır:

  • Tüm oturumlar arka uçtan başka bir arka uç django.contrib.sessions.backends.cachekullanıyorsanız veya varsayılanı kullanıyorsanız get_session_auth_hash().
  • CookieStorageVeya kullanıyorsanız tüm mesajlar FallbackStorage.
  • Tüm PasswordResetView belirteçleri.
  • Farklı bir anahtar sağlanmadığı sürece herhangi bir kriptografik imzalama kullanımı.

Gizli anahtarınızı döndürürseniz, yukarıdakilerin tümü geçersiz kılınacaktır. Gizli anahtarlar kullanıcıların parolaları için kullanılmaz ve anahtar döndürme onları etkilemez.


5
SECRET_KEYDöndürülürse ne olacağı hakkında yararlı bilgiler . +1
Hassan Baig
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.