2011-09-11 31 views
76

django中的SECRET_KEY究竟是什麼?我做了一些谷歌搜索,並檢出了文檔(https://docs.djangoproject.com/en/dev/ref/settings/#secret-key),但我正在尋找更深入的解釋,以及爲什麼它是必需的。Django設置'SECRET_KEY'的用途

例如,如果密鑰泄露/其他人知道它是什麼會發生什麼?謝謝。

+3

如果您有密鑰,並且已泄密並釋放給其他人,則說明您有問題。不管你是否使用Django。 –

+19

但是,究竟是什麼問題? – tobych

+3

我做了一個徹底的答案[這裏](http://stackoverflow.com/questions/15170637/effects-of-changing-djangos-secret-key/15383766?noredirect=1#comment21743494_15383766)(無恥的插件) – sberder

回答

60

它用於製作哈希。看:

>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

那他們爲什麼不把它叫做鹽呢? ;) – datenwolf

+9

這是一個猜測,但我想告訴人們「不要分享你的SECRET_KEY」比較容易,而不是「你的'SALT'是你應該保留的一個祕密密鑰。」 –

+5

這種區分非常重要。在密碼學中,鹽不是祕密的,但SECRET_KEY必須保持安全。 SECRET_KEY的使用更類似於在諸如HMAC之類的簽名散列中使用密鑰(如果不考慮性能,則可能會使用HMAC)。 –

2

Django documentation for cryptographic signing覆蓋「SECRET_KEY」設置的用途:

該值的SECRET_KEY設置]的關鍵是確保簽名的數據 - 這是你保持這樣的安全是至關重要的,或者攻擊者可以用它來生成自己的簽名值。

(本節也從the Django documentation for the ‘SECRET_KEY’ setting引用。)

在Django的加密簽名API可用於任何應用程序的價值觀密碼安全簽名。 Django的利用了這個在不同的高級特性:

  • Signing serialised data(例如JSON文件)。

  • 的用戶會話,密碼重置請求,消息等

  • 預防跨站點或重放攻擊的唯一令牌通過添加(然後期望)的唯一值的請求。

  • 爲散列函數生成獨特的鹽。

所以,一般的回答是:有一個Django應用程序需要一個加密簽名的東西,而「SECRET_KEY」設置用於那些關鍵。它需要具有密碼學上強大的內容(難以被計算機猜測),並且在所有Django實例之間都是唯一的。