Django सेटिंग 'SECRET_KEY' का उद्देश्य


157

वास्तव में क्या बात है SECRET_KEY ? मैंने कुछ Google खोज कीं और डॉक्स ( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key ) की जाँच की , लेकिन मैं इसके बारे में अधिक गहराई से खोज कर रहा था, और इसकी आवश्यकता क्यों है।

उदाहरण के लिए, क्या हो सकता है यदि कुंजी से समझौता किया गया था / दूसरों को पता था कि यह क्या था? धन्यवाद।


4
यदि आपके पास एक गुप्त कुंजी है, और यह समझौता किया गया है और दूसरों को जारी किया गया है, तो आपको एक समस्या है। इससे कोई फर्क नहीं पड़ता कि आप Django का उपयोग कर रहे हैं या नहीं।
जेरेड फरिश

35
लेकिन क्या समस्या है, बिल्कुल?
tobych

7
मैंने यहाँ (बेशर्म प्लग) एक पूरी तरह से जवाब दिया
sberder

4
@ साबर शायद आपको इस प्रश्न का उत्तर भी लिखना चाहिए। मुझे लगता है कि आप इसे स्वीकृत गैर-उत्तर की तुलना में बहुत बेहतर कर सकते हैं।
कास्परड

जवाबों:


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
उन्होंने इसे नमक क्यों नहीं कहा? ;)
डेटेनवुल्फ़

29
यह एक अनुमान है, लेकिन मुझे लगता है कि लोगों को "अपना हिस्सा नहीं देना" बताना आसान है SECRET_KEY, जैसा कि "आपके SALTलिए एक गुप्त कुंजी है जिसे आपको अपने पास रखना चाहिए।"
रोशन मैथ्यूज

12
वह भेद बहुत महत्वपूर्ण है। क्रिप्टोग्राफी में, लवण गुप्त नहीं हैं, लेकिन SECRET_KEYउन्हें सुरक्षित रखा जाना चाहिए। इस SECRET_KEYतरह के HMAC (जो, अगर प्रदर्शन एक विचार नहीं था, शायद इसका इस्तेमाल किया जाएगा) के रूप में एक हस्ताक्षरित हैश में एक कुंजी का उपयोग करने के लिए बहुत अधिक के समान है।
ट्रैविस जेन्सेन

32
यह मेरे लिए एक जवाब की तरह नहीं दिखता है। आपने जो कुछ भी किया, वह यह बताए बिना एक ही grep कमांड था। "कुंजी से समझौता किए जाने पर क्या हो सकता है?"
कास्परड

SECRET_KEY गोपनीय होने के बाद भी, एक SECRET को कुंजी के साथ उपसर्ग करना सुनिश्चित करता है कि Django उन मानों को एन्क्रिप्ट / मास्क करेगा जहां कभी भी आवश्यकता होगी।
लिनस_ ३०

36

क्रिप्टोग्राफिक हस्ताक्षर करने के लिए Django प्रलेखन 'SECRET_KEY' की स्थापना का उपयोग करता है को शामिल किया गया:

यह मान [ SECRET_KEYसेटिंग] हस्ताक्षरित डेटा को सुरक्षित करने की कुंजी है - यह महत्वपूर्ण है कि आप इसे सुरक्षित रखते हैं, या हमलावर इसका उपयोग अपने स्वयं के हस्ताक्षरित मूल्यों को उत्पन्न करने के लिए कर सकते हैं।

(इस खंड को 'SECRET_KEY' सेटिंग के लिए Django प्रलेखन से भी संदर्भित किया गया है ।)

Django में क्रिप्टोग्राफ़िक साइनिंग API मूल्यों पर क्रिप्टोग्राफ़िक रूप से सुरक्षित हस्ताक्षर के लिए किसी भी ऐप के लिए उपलब्ध है। Django खुद विभिन्न उच्च-स्तरीय सुविधाओं में इसका उपयोग करता है:

  • क्रमबद्ध डेटा (जैसे JSON दस्तावेज़) पर हस्ताक्षर करना

  • उपयोगकर्ता सत्र, पासवर्ड रीसेट अनुरोध, संदेश, आदि के लिए अद्वितीय टोकन

  • अनुरोध के लिए अद्वितीय मानों को जोड़कर (और फिर अपेक्षा) करके क्रॉस-साइट या रीप्ले हमलों की रोकथाम।

  • हैश कार्यों के लिए एक अद्वितीय नमक बनाना।

तो, सामान्य उत्तर यह है: एक Django ऐप में कई चीजें हैं जिनके लिए एक क्रिप्टोग्राफिक हस्ताक्षर की आवश्यकता होती है, और 'SECRET_KEY' सेटिंग उन लोगों के लिए उपयोग की जाने वाली कुंजी है। यह सभी Django उदाहरणों के बीच क्रिप्टोग्राफी की मजबूत मात्रा में एंट्रॉपी (कंप्यूटर के लिए कठिन अनुमान लगाने के लिए) और अद्वितीय होने की आवश्यकता है।


1
"और सभी Django उदाहरणों के बीच अद्वितीय।" - क्या इसका मतलब यह है कि अगर मेरे पास 3 webservers हैं जो लोड बैलेंसर के पीछे एक ही Django ऐप को चला रहे हैं तो मेरे पास 3 अलग SECRET_KEYसेटिंग्स होनी चाहिए ?
एडम पार्किन

2
@AdamParkin, कि एक नए सवाल के लिए एक अच्छी शुरुआत की तरह लगता है , अपना जवाब पाने के लिए।
bignose

2
शानदार सुझाव, किया गया: stackoverflow.com/questions/51657422/…
एडम पार्किं

19

Django प्रलेखन के अनुसार परSECRET_KEY :

गुप्त कुंजी का उपयोग इसके लिए किया जाता है:

  • सभी सत्र यदि आप किसी अन्य सत्र बैकएंड django.contrib.sessions.backends.cacheका उपयोग कर रहे हैं, या डिफ़ॉल्ट का उपयोग कर रहे हैं get_session_auth_hash()
  • सभी संदेश यदि आप उपयोग कर रहे हैं CookieStorageया FallbackStorage
  • सभी PasswordResetView टोकन।
  • क्रिप्टोग्राफ़िक हस्ताक्षर का कोई उपयोग, जब तक कि एक अलग कुंजी प्रदान नहीं की जाती है।

यदि आप अपनी गुप्त कुंजी घुमाते हैं, तो उपरोक्त सभी अमान्य हो जाएंगे। गुप्त कुंजी का उपयोग उपयोगकर्ताओं के पासवर्ड के लिए नहीं किया जाता है और कुंजी रोटेशन उन्हें प्रभावित नहीं करेगा।


5
यदि SECRET_KEYघुमाया जाए तो क्या होता है, इस बारे में उपयोगी जानकारी । +1
हसन बेग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.