장고 설정의 목적 'SECRET_KEY'


157

SECRET_KEY장고 의 요점은 정확히 무엇입니까 ? 몇 가지 Google 검색을 수행하고 문서 ( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key )를 확인했지만 이에 대한 자세한 설명을 찾고 있었지만 왜 필요한지.

예를 들어, 키가 손상되었거나 다른 사람이 키가 무엇인지 알면 어떻게 될 수 있습니까? 감사합니다.


4
비밀 키가 있고 다른 사람이 타협하고 공개 한 경우 문제가있는 것입니다. Django를 사용하는지 여부는 중요하지 않습니다.
Jared Farrish

35
그러나 정확히 어떤 문제입니까?
tobych

7
나는 여기에 철저한 대답을 했다 (뻔뻔한 플러그)
sberder

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

29
이것은 추측이지만 SECRET_KEY, "당신 SALT은 당신 이 자신에게 간직해야 할 비밀 열쇠 "가 아니라 사람들에게 "당신의 것을 공유하지 마십시오"라고 말하는 것이 더 쉽다고 생각합니다 .
Roshan Mathews

12
그 구별은 매우 중요합니다. 암호화에서 소금은 비밀이 아니지만 SECRET_KEY보안을 유지해야합니다. 를 사용하는 SECRET_KEY것은 HMAC와 같은 서명 된 해시에서 키를 사용하는 것과 훨씬 유사합니다 (성능이 고려되지 않은 경우 대신 사용됨).
트래비스 젠슨

32
이것은 나에게 답처럼 보이지 않습니다. 무엇을했는지 설명하지 않고 단일 grep 명령 만 수행했습니다. "키가 손상되면 어떻게됩니까?"에 대한 대답은 어디에 있습니까?
kasperd

또한 SECRET_KEY는 기밀이므로 SECRET를 키 앞에 접두어 사용하면 Django가 필요에 따라 값을 암호화 / 마스킹 할 수 있습니다.
Linus_30

36

암호화 서명을위한 장고 문서는 'SECRET_KEY'설정의 사용을 설명합니다 :

이 값 [ SECRET_KEY설정]은 서명 된 데이터를 보호하는 열쇠입니다.이 보안을 유지하는 것이 중요합니다. 그렇지 않으면 공격자가이 값을 사용하여 자체 서명 된 값을 생성 할 수 있습니다.

(이 섹션은 Django 문서에서 'SECRET_KEY'설정에 대해서도 참조됩니다 .)

Django의 암호화 서명 API는 모든 앱에서 값에 대한 암호화 보안 서명을 위해 사용할 수 있습니다. 장고 자체는 다양한 고급 기능에서 이것을 사용합니다.

  • 직렬화 된 데이터 서명 (예 : JSON 문서)

  • 사용자 세션, 비밀번호 재설정 요청, 메시지 등을위한 고유 토큰

  • 요청에 고유 한 값을 추가 한 다음 예상하여 교차 사이트 또는 재생 공격을 방지합니다.

  • 해시 함수를위한 고유 한 솔트 생성.

따라서 일반적인 대답은 다음과 같습니다. Django 앱에는 암호화 서명이 필요한 많은 것들이 있으며 'SECRET_KEY'설정이 그 열쇠입니다. 암호화 적으로 강력한 엔트로피가 있어야하고 (컴퓨터가 추측하기 어려운) 모든 Django 인스턴스간에 고유해야합니다.


1
"그리고 모든 Django 인스턴스간에 고유합니다." -이것은로드 밸런서 뒤에서 동일한 Django 앱을 실행하는 3 대의 웹 서버가 있고 3 개의 고유 한 SECRET_KEY설정 이 있어야한다고 암시 합니까?
Adam Parkin

2
@AdamParkin 은 새로운 질문에 대한 좋은 시작처럼 들리 며 자체 답변을 얻습니다.
bignose


19

Django Documentation에 따르면SECRET_KEY :

비밀 키는 다음 용도로 사용됩니다.

  • 모든 세션은 당신이 아닌 다른 세션 백엔드를 사용하는 경우 django.contrib.sessions.backends.cache, 또는 기본값을 사용하고 있습니다 get_session_auth_hash().
  • 모든 메시지는 당신이 사용하는 경우 CookieStorageFallbackStorage.
  • 모든 PasswordResetView 토큰.
  • 다른 키가 제공되지 않는 한 암호화 서명 사용.

비밀 키를 돌리면 위의 모든 것이 무효화됩니다. 비밀 키는 사용자의 암호에 사용되지 않으며 키 회전은 영향을 미치지 않습니다.


5
SECRET_KEY회전 하면 어떻게되는지에 관한 유용한 정보 . +1
Hassan Baig '
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.