Mục đích của cài đặt Django 'SECRET_KEY'


157

Chính xác thì điểm của SECRET_KEYdjango là gì? Tôi đã thực hiện một vài tìm kiếm trên google và kiểm tra các tài liệu ( https://docs.djangoproject.com/en/dev/ref/sinstall/#secret-key ), nhưng tôi đang tìm kiếm một lời giải thích sâu hơn về điều này, và tại sao nó được yêu cầu.

Ví dụ, điều gì có thể xảy ra nếu khóa bị xâm phạm / người khác biết nó là gì? Cảm ơn bạn.


4
Nếu bạn có một khóa bí mật, và nó bị xâm phạm và phát hành cho người khác, bạn có một vấn đề. Không quan trọng bạn có sử dụng Django hay không.
Jared Farrish

35
Nhưng vấn đề chính xác là gì?
tạm biệt

7
Tôi đã làm một câu trả lời thấu đáo ở đây (phích cắm không biết xấu hổ)
sberder

4
@sberder Có lẽ bạn cũng nên viết câu trả lời cho câu hỏi này. Tôi tưởng tượng bạn có thể làm điều đó tốt hơn nhiều so với câu trả lời không được chấp nhận.
kasperd 04/07/2015

Câu trả lời:


92

Nó được sử dụng để làm băm. Nhìn:

>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
Tại sao họ không gọi nó là muối? ;)
datenwolf

29
Đây là một phỏng đoán, nhưng tôi cho rằng sẽ dễ dàng hơn để nói với mọi người "đừng chia sẻ SECRET_KEY" của bạn , trái ngược với "bạn SALTlà một chìa khóa bí mật mà bạn nên giữ cho chính mình".
Roshan Mathews

12
Sự phân biệt đó rất quan trọng. Trong mật mã, muối không phải là bí mật, nhưng SECRET_KEYphải được giữ an toàn. Việc sử dụng SECRET_KEYgần giống với việc sử dụng khóa trong hàm băm đã ký như HMAC (mà nếu hiệu suất không phải là một sự cân nhắc, có lẽ sẽ được sử dụng thay thế).
Travis Jensen

32
Đây không giống như một câu trả lời cho tôi. Tất cả những gì bạn đã làm là một lệnh grep duy nhất mà không giải thích bất kỳ lệnh nào trong số đó. Đâu là câu trả lời cho "điều gì có thể xảy ra nếu khóa bị xâm phạm?"?
kasperd 04/07/2015

Ngoài ra, vì SECRET_KEY là bí mật, nên tiền tố SECRET vào khóa đảm bảo Django sẽ mã hóa / che dấu các giá trị khi cần.
Linus_30

36

Các tài liệu Django cho ký mã hóa bao gồm những ứng dụng của 'SECRET_KEY' thiết lập:

Giá trị này [ SECRET_KEYcài đặt] là chìa khóa để bảo mật dữ liệu đã ký - điều quan trọng là bạn giữ an toàn này hoặc kẻ tấn công có thể sử dụng nó để tạo các giá trị đã ký của riêng họ.

(Phần này cũng được tham chiếu từ tài liệu Django cho cài đặt 'SECRET_KEY' .)

API ký mã hóa trong Django có sẵn cho bất kỳ ứng dụng nào cho chữ ký được bảo mật bằng mật mã trên các giá trị. Django sử dụng điều này trong các tính năng cấp cao khác nhau:

  • Ký dữ liệu tuần tự (ví dụ: tài liệu JSON).

  • Mã thông báo duy nhất cho phiên người dùng, yêu cầu đặt lại mật khẩu, tin nhắn, v.v.

  • Ngăn chặn các cuộc tấn công chéo trang hoặc phát lại bằng cách thêm (và sau đó mong đợi) các giá trị duy nhất cho yêu cầu.

  • Tạo một muối duy nhất cho các hàm băm.

Vì vậy, câu trả lời chung là: Có nhiều thứ trong ứng dụng Django yêu cầu chữ ký mã hóa và cài đặt 'SECRET_KEY' là khóa được sử dụng cho những thứ đó. Nó cần phải có một lượng entropy mạnh về mật mã (khó cho máy tính đoán) và duy nhất giữa tất cả các phiên bản Django.


1
"và duy nhất giữa tất cả các phiên bản Django." - điều này có nghĩa là nếu tôi có 3 máy chủ web chạy cùng một ứng dụng Django phía sau bộ cân bằng tải thì tôi nên có 3 SECRET_KEYcài đặt riêng biệt ?
Adam Parkin

2
@AdamParkin, nghe có vẻ như là một khởi đầu tốt cho một câu hỏi mới , để có câu trả lời của riêng mình.
bignose

2
Gợi ý tuyệt vời, được thực hiện: stackoverflow.com/questions/51657422/ Kẻ
Adam Parkin

19

Theo Tài liệu Django trênSECRET_KEY :

Khóa bí mật được sử dụng cho:

  • Tất cả các phiên nếu bạn đang sử dụng bất kỳ phiên phụ trợ nào khác django.contrib.sessions.backends.cachehoặc đang sử dụng mặc định get_session_auth_hash().
  • Tất cả các tin nhắn nếu bạn đang sử dụng CookieStoragehoặc FallbackStorage.
  • Tất cả các mã thông báo PasswordResetView.
  • Bất kỳ việc sử dụng ký mã hóa, trừ khi một khóa khác được cung cấp.

Nếu bạn xoay khóa bí mật của mình, tất cả những điều trên sẽ bị vô hiệu. Khóa bí mật không được sử dụng cho mật khẩu của người dùng và xoay khóa sẽ không ảnh hưởng đến họ.


5
Thông tin hữu ích liên quan đến những gì xảy ra nếu SECRET_KEYđược xoay. +1
Hassan Baig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.