django中的SECRET_KEY
究竟是什麼?我做了一些谷歌搜索,並檢出了文檔(https://docs.djangoproject.com/en/dev/ref/settings/#secret-key),但我正在尋找更深入的解釋,以及爲什麼它是必需的。Django設置'SECRET_KEY'的用途
例如,如果密鑰泄露/其他人知道它是什麼會發生什麼?謝謝。
django中的SECRET_KEY
究竟是什麼?我做了一些谷歌搜索,並檢出了文檔(https://docs.djangoproject.com/en/dev/ref/settings/#secret-key),但我正在尋找更深入的解釋,以及爲什麼它是必需的。Django設置'SECRET_KEY'的用途
例如,如果密鑰泄露/其他人知道它是什麼會發生什麼?謝謝。
它用於製作哈希。看:
>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()
那他們爲什麼不把它叫做鹽呢? ;) – datenwolf
這是一個猜測,但我想告訴人們「不要分享你的SECRET_KEY」比較容易,而不是「你的'SALT'是你應該保留的一個祕密密鑰。」 –
這種區分非常重要。在密碼學中,鹽不是祕密的,但SECRET_KEY必須保持安全。 SECRET_KEY的使用更類似於在諸如HMAC之類的簽名散列中使用密鑰(如果不考慮性能,則可能會使用HMAC)。 –
的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實例之間都是唯一的。
如果您有密鑰,並且已泄密並釋放給其他人,則說明您有問題。不管你是否使用Django。 –
但是,究竟是什麼問題? – tobych
我做了一個徹底的答案[這裏](http://stackoverflow.com/questions/15170637/effects-of-changing-djangos-secret-key/15383766?noredirect=1#comment21743494_15383766)(無恥的插件) – sberder