วัตถุประสงค์ของการตั้งค่า Django 'SECRET_KEY'


157

ประเด็นของSECRET_KEYdjango คืออะไร? ฉันค้นหา google สักสองสามครั้งและดูเอกสาร ( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key ) แต่ฉันกำลังมองหาคำอธิบายเชิงลึกเพิ่มเติม และทำไมมันจำเป็นต้องใช้

ตัวอย่างเช่นจะเกิดอะไรขึ้นถ้าคีย์ถูกบุกรุก / คนอื่น ๆ รู้ว่ามันคืออะไร? ขอบคุณ.


4
หากคุณมีรหัสลับและมันถูกบุกรุกและปล่อยให้คนอื่นคุณมีปัญหา ไม่สำคัญว่าคุณใช้ Django หรือไม่
Jared Farrish

35
แต่ปัญหาอะไรกันแน่
tobych

7
ฉันไม่ได้คำตอบอย่างละเอียดที่นี่ (ไร้ยางอายปลั๊ก)
sberder

4
@ sberder บางทีคุณควรเขียนคำตอบสำหรับคำถามนี้ด้วย ฉันคิดว่าคุณสามารถทำได้ดีกว่าคำตอบที่ไม่ยอมรับ
kasperd

คำตอบ:


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
ทำไมพวกเขาไม่เรียกมันว่าเกลือล่ะ? ;)
datenwolf

29
นี่เป็นการคาดเดา แต่ฉันคิดว่าเป็นการง่ายกว่าที่จะบอกคนอื่นว่า "อย่าแชร์SECRET_KEY" ตรงกันข้ามกับ "คุณSALTเป็นรหัสลับที่คุณควรเก็บไว้กับตัวเอง"
Roshan Mathews

12
ความแตกต่างนั้นสำคัญมาก ในการเข้ารหัสเกลือไม่ได้เป็นความลับ แต่SECRET_KEYต้องรักษาความปลอดภัย การใช้SECRET_KEYคีย์นั้นคล้ายกับการใช้คีย์ในแฮชที่ลงนามแล้วเช่น HMAC (ซึ่งหากประสิทธิภาพไม่ได้เป็นข้อพิจารณาก็อาจใช้แทน)
เทรวิสเซ่น

32
มันดูเหมือนคำตอบสำหรับฉัน สิ่งที่คุณทำคือคำสั่ง grep เพียงคำเดียวโดยไม่อธิบายว่ามันทำอะไร คำตอบสำหรับ "สิ่งที่อาจเกิดขึ้นหากคีย์ถูกบุกรุก"?
kasperd

นอกจากนี้เนื่องจาก SECRET_KEY เป็นความลับการนำหน้า SECRET ไปที่คีย์จะทำให้มั่นใจได้ว่า Django จะเข้ารหัส / ปกปิดค่าที่จำเป็น
Linus_30

36

เอกสาร Django สำหรับการลงนามการเข้ารหัสลับที่ครอบคลุมการใช้งานของ 'SECRET_KEY' การตั้งค่า:

ค่านี้ [การSECRET_KEYตั้งค่า] เป็นกุญแจสำคัญในการรักษาความปลอดภัยข้อมูลที่เซ็นชื่อ - มันเป็นสิ่งสำคัญที่คุณต้องรักษาความปลอดภัยนี้หรือมิฉะนั้นผู้โจมตีสามารถใช้เพื่อสร้างค่าที่เซ็นชื่อของตนเอง

(ส่วนนี้อ้างอิงจากเอกสาร Django สำหรับการตั้งค่า 'SECRET_KEY' )

API การเซ็นชื่อเข้ารหัสใน Django พร้อมใช้งานสำหรับแอปใด ๆ สำหรับลายเซ็นที่เข้ารหัสด้วยความปลอดภัยเกี่ยวกับค่า Django ใช้ประโยชน์จากสิ่งนี้ในคุณสมบัติระดับสูงต่าง ๆ :

  • การลงชื่อข้อมูลที่ต่อเนื่องกัน (เช่นเอกสาร JSON)

  • โทเค็นที่ไม่ซ้ำกันสำหรับเซสชันผู้ใช้การร้องขอรีเซ็ตรหัสผ่านข้อความ ฯลฯ

  • การป้องกันการโจมตีข้ามไซต์หรือเล่นซ้ำโดยการเพิ่ม (และคาดหวัง) ค่าที่ไม่ซ้ำสำหรับคำขอ

  • สร้างเกลือที่เป็นเอกลักษณ์สำหรับฟังก์ชั่นแฮช

ดังนั้นคำตอบทั่วไปคือ: มีหลายสิ่งในแอป Django ที่ต้องใช้ลายเซ็นเข้ารหัสและการตั้งค่า 'SECRET_KEY' เป็นกุญแจสำคัญที่ใช้สำหรับเหล่านั้น จำเป็นต้องมีเอนโทรปีจำนวนมากที่เข้ารหัสลับ (ยากสำหรับคอมพิวเตอร์ที่จะเดา) และไม่ซ้ำกันระหว่างกรณี Django ทั้งหมด


1
"และไม่ซ้ำกันระหว่างอินสแตนซ์ Django ทั้งหมด" - นี่แปลว่าถ้าฉันมี 3 เว็บเซิร์ฟเวอร์ที่รันแอพ Django เดียวกันกับโหลดบาลานซ์ฉันควรมีSECRET_KEYการตั้งค่า3 แบบที่แตกต่างกันหรือไม่?
Adam Parkin

2
@ AdamParkin ดูเหมือนจะเป็นการเริ่มต้นที่ดีสำหรับคำถามใหม่เพื่อรับคำตอบของตัวเอง
bignose

2
ข้อเสนอแนะที่ดีทำ: stackoverflow.com/questions/51657422/…
Adam Parkin

19

ตามเอกสาร Django เมื่อSECRET_KEY :

รหัสลับใช้สำหรับ:

  • การประชุมทั้งหมดถ้าคุณกำลังใช้แบ็กเอนด์เซสชั่นอื่น ๆ ที่ไม่ใช่หรือใช้ค่าเริ่มต้นdjango.contrib.sessions.backends.cacheget_session_auth_hash()
  • ข้อความทั้งหมดถ้าคุณกำลังใช้หรือCookieStorageFallbackStorage
  • PasswordResetView ทั้งหมดโทเค็น
  • การใช้งานของการลงนามการเข้ารหัสใด ๆ เว้นแต่มีการระบุคีย์ที่แตกต่างกัน

หากคุณหมุนรหัสลับของคุณทั้งหมดข้างต้นจะถูกยกเลิก รหัสลับไม่ได้ใช้สำหรับรหัสผ่านของผู้ใช้และการหมุนคีย์จะไม่ส่งผลกระทบต่อพวกเขา


5
ข้อมูลที่เป็นประโยชน์เกี่ยวกับสิ่งที่เกิดขึ้นหากSECRET_KEYมีการหมุน +1
Hassan Baig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.