Django設定の目的 'SECRET_KEY'


157

SECRET_KEYジャンゴでの正確な意味は何ですか?私はいくつかのグーグル検索をして、ドキュメント(https://docs.djangoproject.com/en/dev/ref/settings/#secret-key)をチェックアウトしましたが、これについてのより詳細な説明を探していました、そしてそれが必要な理由。

たとえば、キーが危険にさらされた場合/他の人がそれが何であるかを知っていた場合はどうなりますか?ありがとうございました。


4
秘密鍵があり、それが危険にさらされて他の人に公開された場合、問題があります。Djangoを使用しているかどうかは関係ありません。
Jared Farrish 2011

35
しかし、正確にはどのような問題ですか?
tobych

7
私はここで徹底的な回答をしました(恥知らずなプラグイン)
sberder 2013年

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 2013年

29
これは推測ですが、SECRET_KEY「あなたSALTはあなた自身に守るべき秘密の鍵である」とは対照的に、「あなたを共有しないでください」と人々に伝える方が簡単だと思います。
Roshan Mathews 2013年

12
その区別は非常に重要です。暗号化では、塩は秘密ではSECRET_KEYありませんが、安全に保管する必要があります。の使用は、SECRET_KEYHMACなどの署名付きハッシュでのキーの使用に非常に似ています(パフォーマンスが考慮されない場合は、おそらく代わりに使用されます)。
Travis Jensen 2014年

32
これは私に対する答えのようには見えません。あなたがしたのは、それが何をしているかを説明することなく、単一のgrepコマンドだけでした。「鍵が危険にさらされた場合、どうなりますか?」に対する答えはどこですか?
kasperd 2015

また、SECRET_KEYは機密情報であるため、キーにSECRETをプレフィックスとして付けることで、Djangoが必要に応じて値を暗号化/マスクできるようになります。
Linus_30

36

暗号署名のためのDjangoのドキュメントは「SECRET_KEY」の設定の使用方法を説明します。

この値[ SECRET_KEY設定]は、署名されたデータを保護するための鍵です。これを安全に保つことが重要です。そうしないと、攻撃者がそれを使用して独自の署名された値を生成する可能性があります。

(このセクションは、 'SECRET_KEY'設定のDjangoドキュメントからも参照されます。)

Djangoの暗号化署名APIは、値に暗号化された安全な署名を行うためにあらゆるアプリで利用できます。Django自体は、これをさまざまな上位レベルの機能で利用しています。

  • シリアル化されたデータ(JSONドキュメントなど)への署名

  • ユーザーセッション、パスワードリセットリクエスト、メッセージなどの一意のトークン

  • リクエストに一意の値を追加する(そして期待する)ことによる、クロスサイト攻撃またはリプレイ攻撃の防止。

  • ハッシュ関数の一意のソルトを生成します。

したがって、一般的な答えは次のとおりです。Djangoアプリには暗号署名を必要とするものが多数あり、 'SECRET_KEY'設定はそれらに使用されるキーです。暗号化された強力なエントロピー(コンピューターが推測するのは難しい)を持ち、すべてのDjangoインスタンス間で一意である必要があります。


1
「すべてのDjangoインスタンス間で一意です。」-これは、ロードバランサーの背後で同じDjangoアプリを実行している3つのWebサーバーがある場合、3つの異なるSECRET_KEY設定が必要であることを意味しますか?
アダムパーキン

2
@AdamParkin、それは独自の答えを得るための新しい質問の良いスタートのように思えます。
bignose 2018


19

Django DocumentationによるとSECRET_KEY

秘密鍵は次の目的で使用されます。

  • 以外のセッションバックエンドdjango.contrib.sessions.backends.cacheを使用している場合、またはデフォルトを使用している場合は、すべてのセッションget_session_auth_hash()
  • CookieStorageまたはを使用している場合のすべてのメッセージFallbackStorage
  • すべてのPasswordResetViewトークン。
  • 別のキーが提供されない限り、暗号化署名の使用。

秘密鍵をローテーションすると、上記のすべてが無効になります。秘密鍵はユーザーのパスワードには使用されず、鍵のローテーションはそれらに影響を与えません。


5
SECRET_KEY回転するとどうなるかについての役立つ情報。+1
Hassan Baig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.