2011-09-11 37 views
76

Điểm chính xác của số SECRET_KEY trong django là gì? Tôi đã làm một vài tìm kiếm google và kiểm tra các tài liệu (https://docs.djangoproject.com/en/dev/ref/settings/#secret-key), nhưng tôi đã 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.Mục đích của cài đặt Django ‘SECRET_KEY’

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.

+3

Nếu bạn có khóa bí mật và bị xâm phạm và phát hành cho người khác, bạn gặp sự cố. Nó không quan trọng nếu bạn đang sử dụng Django hay không. –

+19

Nhưng vấn đề là gì? – tobych

+3

Tôi đã làm một câu trả lời kỹ lưỡng [ở đây] (http://stackoverflow.com/questions/15170637/effects-of-changing-djangos-secret-key/15383766?noredirect=1#comment21743494_15383766) (plug shameless) – sberder

Trả lời

60

Nó được sử dụng để tạo 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() 
+4

Tại sao họ không gọi nó là muối? ;) – datenwolf

+9

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

+5

Sự khác biệt đó rất quan trọng. Trong mật mã học, các muối không phải là bí mật, nhưng 'SECRET_KEY' phải được giữ an toàn. Việc sử dụng 'SECRET_KEY' tương tự như việc sử dụng khóa trong một mã băm có chữ ký như HMAC (trong đó, nếu hiệu suất không được xem xét, có lẽ sẽ được sử dụng thay thế). –

2

Các Django documentation for cryptographic signing bao gồm việc sử dụng các thiết lập của SECRET_KEY ':

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

(Phần này cũng được tham chiếu từ the Django documentation for the ‘SECRET_KEY’ setting.)

API ký mật mã trong Django là có sẵn cho bất kỳ ứng dụng chữ ký mã hóa bảo mật trên các giá trị. Bản thân Django sử dụng tính năng này ở các tính năng cấp cao khác nhau:

  • Signing serialised data (ví dụ: tài liệu JSON).

  • thẻ duy nhất cho phiên người dùng, yêu cầu đặt lại mật khẩu, tin nhắn, vv

  • Phòng chống cross-site hay cuộc tấn công replay bằng cách thêm (và sau đó chờ đợi) giá trị duy nhất cho yêu cầu.

  • Tạo một muối duy nhất cho 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ý điện tử và cài đặt ‘SECRET_KEY’ là chìa khóa được sử dụng cho những chữ đó. Nó cần phải có một số tiền mật mã mạnh mẽ của entopy (khó cho các máy tính để đoán) và duy nhất giữa tất cả các trường hợp Django.

Các vấn đề liên quan