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.