programing

demystify Flask app.secret_key

starjava 2023. 7. 1. 07:58
반응형

demystify Flask app.secret_key

한다면app.secret_key설정되지 않았습니다. 플라스크에서 세션 사전을 설정하거나 액세스할 수 없습니다.

플라스크 사용자 가이드가 이 주제에 대해 할 은 이것뿐입니다.

저는 웹 개발에 익숙하지 않아서 보안 작업이 어떻게/왜 작동하는지 전혀 모릅니다.저는 플라스크가 후드 아래서 무엇을 하는지 알고 싶습니다.

  • 플라스크는 왜 우리가 이것을 설정하도록 강요합니까?secret_key재산?
  • 플라스크는 어떻게 사용합니까?secret_key재산?

아래 답변은 주로 웹 응용 프로그램에서 사용되는 세션 개념의 구현인 서명된 쿠키에 관한 것입니다.플라스크는 일반(서명되지 않은) 쿠키를 모두 제공합니다(를 통해request.cookies그리고.response.set_cookie()및된 쿠키)flask.session답변은 두 부분으로 구성되어 있습니다. 첫 번째 부분은 서명된 쿠키가 생성되는 방법을 설명하고, 두 번째 부분은 체계의 다양한 측면을 다루는 일련의 질문/응답으로 제공됩니다.예제에 사용되는 구문은 Python3이지만, 이 개념은 이전 버전에도 적용됩니다.

란?SECRET_KEY(또는 서명된 쿠키를 만드는 방법)?

쿠키에 서명하는 것은 쿠키 조작에 대한 예방 조치입니다.쿠키에 서명하는 과정에서,SECRET_KEY암호를 해시하기 전에 "암호"를 사용하여 암호를 혼동하는 방법과 유사한 방식으로 사용됩니다.여기 개념에 대한 (넓게) 단순화된 설명이 있습니다.예제의 코드는 설명하기 위한 것입니다.많은 단계가 생략되었으며 모든 기능이 실제로 존재하는 것은 아닙니다.여기서의 목표는 주요 아이디어에 대한 일반적인 이해를 제공하는 것이지만, 실질적인 구현에는 약간 더 많은 관련이 있을 것입니다.또한 플라스크는 이미 이 기능의 대부분을 백그라운드에서 제공합니다.따라서 세션 API를 통해 쿠키에 값을 설정하고 다음을 제공하는 것 외에SECRET_KEY을 스스로 다시 것은 만 아니라할: , 그렇할필습니도요게implement만적절.

가난한 사람의 쿠키 서명

브라우저에 응답을 보내기 전에:

a 번째첫aSECRET_KEY 을 다시 경우를 프로그램의 주기 .이 정보는 애플리케이션에만 알려져야 하며 애플리케이션을 다시 시작하는 경우를 포함하여 애플리케이션의 수명 주기 동안 비교적 일정하게 유지되어야 합니다.

# choose a salt, a secret string of bytes
>>> SECRET_KEY = 'my super secret key'.encode('utf8')

쿠키 만들기

>>> cookie = make_cookie(
...     name='_profile', 
...     content='uid=382|membership=regular',
...     ...
...     expires='July 1 2030...'
... )

>>> print(cookie)
name: _profile
content: uid=382|membership=regular...
    ...
    ...
expires: July 1 2030, 1:20:40 AM UTC

서명을 작성하거나 추가(또는 추가)합니다.SECRET_KEY쿠키 바이트 문자열에 연결한 다음 해당 조합에서 해시를 생성합니다.

# encode and salt the cookie, then hash the result
>>> cookie_bytes = str(cookie).encode('utf8')
>>> signature = sha1(cookie_bytes+SECRET_KEY).hexdigest()
>>> print(signature)
7ae0e9e033b5fa53aa....

이제 서명을 한 쪽 끝에 붙입니다.content원래 쿠키의 필드입니다.

# include signature as part of the cookie
>>> cookie.content = cookie.content + '|' + signature
>>> print(cookie)
name: _profile
content: uid=382|membership=regular|7ae0e9...  <--- signature
domain: .example.com
path: /
send for: Encrypted connections only
expires: July 1 2030, 1:20:40 AM UTC

그리고 그것이 고객에게 전송되는 것입니다.

# add cookie to response
>>> response.set_cookie(cookie)
# send to browser --> 

브라우저에서 쿠키를 수신할 때:

가 이 합니다.content원래 쿠키를 반환하는 필드입니다.

# Upon receiving the cookie from browser
>>> cookie = request.get_cookie()
# pop the signature out of the cookie
>>> (cookie.content, popped_signature) = cookie.content.rsplit('|', 1)

응용프로그램의 쿠키와 함께 원본 쿠키 사용SECRET_KEY3 으로 서명을 합니다.단계와 동일한 방법으로 서명을 다시 계산합니다.

# recalculate signature using SECRET_KEY and original cookie
>>> cookie_bytes = str(cookie).encode('utf8')
>>> calculated_signature = sha1(cookie_bytes+SECRET_KEY).hexdigest()

계산된 결과를 방금 받은 쿠키에서 이전에 튀어나온 서명과 비교합니다.일치하는 경우 쿠키가 손상되지 않았음을 알 수 있습니다.그러나 쿠키에 공백만 추가된 경우에는 서명이 일치하지 않습니다.

# if both signatures match, your cookie has not been modified
>>> good_cookie = popped_signature==calculated_signature

일치하지 않는 경우 원하는 수의 작업으로 응답하고, 이벤트 기록, 쿠키 삭제, 새로 만들기, 로그인 페이지로 리디렉션할 수 있습니다.

>>> if not good_cookie:
...     security_log(cookie)

해시 기반 메시지 인증 코드(HMAC)

암호화에서 일부 내용의 무결성을 보장하기 위해 비밀 키가 필요한 위에서 생성된 서명 유형을 메시지 인증 코드 또는 MAC라고 합니다.

앞서 위의 예는 그 개념을 지나치게 단순화한 것이며 자신의 서명을 구현하는 것은 좋은 생각이 아니라고 명시했습니다.플라스크에서 쿠키를 서명하는 데 사용되는 알고리즘을 HMAC라고 하며 위의 간단한 단계별 알고리즘보다 조금 더 관여하기 때문입니다.일반적인 생각은 같지만, 이 논의의 범위를 벗어난 이유로 인해 일련의 계산은 조금 더 복잡합니다.일반적으로 그렇듯이 아직도 DIY 제작에 관심이 있다면 Python은 시작하는 데 도움이 되는 몇 가지 모듈을 가지고 있습니다 :) 여기 시작 블록이 있습니다.

import hmac
import hashlib

def create_signature(secret_key, msg, digestmod=None):
    if digestmod is None:
        digestmod = hashlib.sha1
    mac = hmac.new(secret_key, msg=msg, digestmod=digestmod)
    return mac.digest()

hmachashlib에 대한 설명서입니다.


의 "SECRET_KEY:)

이 맥락에서 "서명"은 무엇입니까?

이는 일부 내용이 권한을 부여받은 개인 또는 단체 이외의 사람에 의해 수정되지 않았음을 확인하는 방법입니다.

가장 간단한 서명 형식 중 하나는 "체크섬"으로, 두 개의 데이터가 동일한지 확인합니다.예를 들어 소스에서 소프트웨어를 설치할 때는 먼저 소스 코드의 복사본이 작성자의 복사본과 동일한지 확인하는 것이 중요합니다.이를 위한 일반적인 접근 방식은 암호화 해시 함수를 통해 소스를 실행하고 출력을 프로젝트의 홈 페이지에 게시된 체크섬과 비교하는 것입니다.

예를 들어 웹 미러에서 프로젝트의 소스를 압축된 파일로 다운로드하려고 한다고 가정해 보겠습니다.프로젝트 웹 페이지에 게시된 SHA1 체크섬은 'eb84e8da7ca23e9f83...'입니다.

# so you get the code from the mirror
download https://mirror.example-codedump.com/source_code.tar.gz
# you calculate the hash as instructed
sha1(source_code.tar.gz)
> eb84e8da7c....

두 해시 모두 동일합니다. 동일한 복사본을 가지고 있습니다.

쿠키가 뭐죠?

쿠키에 대한 광범위한 논의는 이 질문의 범위를 벗어납니다.가 어떻게 왜 더 잘 하는 데 이 될 수 있기 합니다.SECRET_KEYi▁readings. HTTP 쿠키에 개인적인 내용을 .저는 당신이 HTTP 쿠키에 대한 몇 가지 개인적인 판독을 후속 조치할 것을 강력히 권장합니다.

웹 응용 프로그램의 일반적인 방법은 클라이언트(웹 브라우저)를 경량 캐시로 사용하는 것입니다.쿠키는 이 방법의 한 가지 구현입니다.쿠키는 일반적으로 서버가 헤더를 통해 HTTP 응답에 추가하는 일부 데이터입니다.이 파일은 HTTP 헤더를 통해 요청을 발행할 때 서버로 다시 전송되는 브라우저에 의해 보관됩니다.쿠키에 포함된 데이터는 서버가 클라이언트와의 지속적인 연결을 유지하고 있다는 착각인 상태 유지라고 하는 것을 에뮬레이트하는 데 사용될 수 있습니다.이 경우에만 연결을 "활성" 상태로 유지하는 와이어 대신 클라이언트의 요청을 처리한 후 응용 프로그램 상태에 대한 스냅샷을 가질 수 있습니다.이러한 스냅샷은 클라이언트와 서버 간에 이동됩니다.요청을 수신하면 서버는 먼저 쿠키의 내용을 읽어 클라이언트와의 대화 내용을 다시 설정합니다.그런 다음 해당 컨텍스트 내에서 요청을 처리하고 클라이언트에 응답을 반환하기 전에 쿠키를 업데이트합니다.따라서 진행 중인 세션의 환상은 유지됩니다.

쿠키는 어떻게 생겼습니까?

일반적인 쿠키는 다음과 같습니다.

name: _profile
content: uid=382|status=genie
domain: .example.com
path: /
send for: Encrypted connections only
expires: July 1 2030, 1:20:40 AM UTC

쿠키는 최신 브라우저에서 읽기에는 사소한 것입니다.예를 들어 Firefox의 경우 기본 설정 > 개인 정보 > 기록 > 개별 쿠키 제거로 이동합니다.

content필드가 응용프로그램과 가장 관련이 있습니다.다른 필드에는 다양한 영향 범위를 지정하는 메타 명령이 대부분 포함되어 있습니다.

왜 쿠키를 사용합니까?

간단히 말해 성능입니다.쿠키를 사용하면 다양한 데이터 저장소(메모리 캐시, 파일, 데이터베이스 등)에서 검색할 필요성을 최소화하여 서버 응용프로그램의 작업 속도를 높일 수 있습니다.쿠키가 클수록 네트워크를 통한 페이로드가 무거워지므로 서버의 데이터베이스 검색에서 저장한 내용은 네트워크를 통해 손실될 수 있습니다.쿠키에 무엇을 포함할지 신중하게 고려합니다.

쿠키에 서명해야 하는 이유는 무엇입니까?

쿠키는 모든 종류의 정보를 보관하는 데 사용되며, 그 중 일부는 매우 민감할 수 있습니다.또한 이들은 본질적으로 안전하지 않으며, 클라이언트와 서버 모두에 대해 여러 가지 보조적 예방 조치를 취해야 합니다.쿠키 서명은 특히 서버 응용프로그램을 속이는 시도에서 쿠키가 발생할 수 있는 문제를 해결합니다.다른 유형의 취약성을 완화하기 위한 다른 조치가 있습니다. 쿠키에 대해 자세히 읽어보시기 바랍니다.

쿠키가 어떻게 조작될 수 있습니까?

쿠키는 텍스트 형식으로 클라이언트에 상주하며, 편집 작업 없이도 편집할 수 있습니다.서버 응용프로그램에서 수신한 쿠키는 여러 가지 이유로 수정될 수 있으며, 일부 이유는 악의가 없을 수 있습니다.쿠키에 대한 사용자에 대한 권한 정보를 유지하고 해당 정보를 기반으로 권한을 부여하는 웹 응용 프로그램을 상상해 보십시오.쿠키가 고장이 나지 않는 경우, 누구나 자신의 상태를 "role=admin"에서 "role=admin"으로 상향 조정할 수 있으며 응용 프로그램도 마찬가지입니다.

가 죠?SECRET_KEY쿠키에 서명할 필요가 있습니까?

쿠키를 확인하는 것은 앞에서 설명한 방법으로 소스 코드를 확인하는 것과 약간 다릅니다.소스 코드의 경우, 원본 작성자는 공개 상태로 유지될 참조 지문(체크섬)의 수탁자 및 소유자입니다.신뢰하지 않는 것은 소스 코드이지만 공개 서명은 신뢰합니다.따라서 원본 복사본을 확인하려면 계산된 해시가 공용 해시와 일치하기만 하면 됩니다.

하지 않는 , 는 서명을 합니다.SECRET_KEY.SECRET_KEY참조 지문입니다.쿠키는 합법적이라고 주장하는 서명과 함께 이동합니다.여기서 정당성이란 서명은 쿠키의 소유자가 발급한 것, 즉 애플리케이션을 의미하는데, 이 경우에는 신뢰할 수 없다는 주장이고 서명의 유효성을 확인해야 합니다., 이위해서알있요포합함소니야다해를는고만용를사명자에▁to▁ins입니다.SECRET_KEY누군가 쿠키를 변경할 수는 있지만 유효한 서명을 올바르게 계산할 수 있는 비밀 성분이 없기 때문에 쿠키를 스푸핑할 수 없습니다.조금 전에 언급했듯이 체크섬 위에 비밀 키를 제공하는 이러한 유형의 지문은 메시지 인증 코드라고 합니다.

세션은 어떻습니까?

은 존구현만세 ID은포쿠함에 입니다.content 드, 더session_id세션의 목적은 서명된 쿠키와 정확히 동일합니다. 즉, 쿠키 조작을 방지하기 위한 것입니다.하지만 클래식 세션은 다른 접근 방식을 가지고 있습니다.세션 쿠키를 수신하면 서버는 ID를 사용하여 데이터베이스, 파일 또는 때로는 메모리의 캐시 등 자신의 로컬 저장소에서 세션 데이터를 검색합니다.세션 쿠키는 일반적으로 브라우저가 닫힐 때 만료되도록 설정됩니다.로컬 스토리지 조회 단계로 인해 이러한 세션 구현은 일반적으로 성능 저하를 초래합니다.서명된 쿠키는 선호되는 대안이 되고 있으며 플라스크의 세션은 그렇게 구현됩니다.즉, 플라스크 세션은 서명된 쿠키이며, 서명된 쿠키를 플라스크에서 사용하려면 다음을 사용합니다.SessionAPI.API.

쿠키도 암호화하지 그래요?

때로는 서명하기 에 쿠키의 내용을 암호화할 수도 있습니다.이 작업은 너무 민감하여 브라우저에서 볼 수 없는 것으로 판단될 경우 수행됩니다(암호화로 내용이 숨겨짐).그러나 단순히 쿠키에 서명하는 것은 브라우저에서 쿠키에 대한 가시성과 유용성을 어느 정도 유지하면서 쿠키가 간섭되지 않도록 하려는 다른 요구를 해결합니다.

변경하면 어떻게 됩니까?SECRET_KEY?

SECRET_KEY이전 키로 서명한 모든 쿠키를 무효화합니다.응용프로그램이 이전에 서명한 쿠키가 포함된 요청을 수신할 때SECRET_KEY▁the▁with▁signature▁the▁will다▁try▁it것▁new▁calculate로 서명을 계산하려고 할 것입니다.SECRET_KEY그리고 두 서명이 일치하지 않고 쿠키와 쿠키의 모든 데이터가 거부됩니다. 브라우저가 처음으로 서버에 연결되는 것처럼 됩니다.사용자는 로그아웃되고 이전 쿠키는 내부에 저장된 모든 쿠키와 함께 잊혀집니다.이것은 만료된 쿠키를 처리하는 방법과는 다릅니다.만료된 쿠키는 서명이 체크아웃되면 임대 기간이 연장될 수 있습니다.잘못된 서명은 일반적으로 잘못된 쿠키를 의미합니다.

따라서 서명된 쿠키를 모두 무효화하지 않으려면 다음을 유지합니다.SECRET_KEY장기적인 경우에도 동일합니다.

가 좋을까요?SECRET_KEY?

비밀 키는 추측하기 어려울 것입니다.세션에 대한 설명서에는 랜덤 키 생성을 위한 좋은 방법이 나와 있습니다.

>>> import os
>>> os.urandom(24)
'\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'

은 " 키복사하구파다붙값다여니습넣으로음일성에"입니다.SECRET_KEY.

임의로 생성된 키를 사용하지 않고, 바이트 형식으로 인코딩된 사용자만 알고 있는 문장으로 배열된 복잡한 단어, 숫자 및 기호 모음을 사용할 수 있습니다.

설정 안 SECRET_KEY호출될 때마다 다른 키를 생성하는 기능을 직접 사용할 수 있습니다.예를 들어, 다음 작업을 수행하지 않습니다.

# this is not good
SECRET_KEY = random_key_generator()

응용 프로그램이 다시 시작될 때마다 새 키가 제공되므로 이전 키는 무효화됩니다.

대신 대화형 파이썬 셸을 열고 함수를 호출하여 키를 생성한 다음 구성에 복사하여 붙여넣습니다.

암호화가 필요한 경우(공격자에 의한 변조를 방지하기 위해) 비밀 키를 설정해야 합니다.플라스크 그 자체만으로도, 그 '무엇이든'은Session개체, 그러나 다른 확장은 동일한 암호를 사용할 수 있습니다.

secret_key는 단지 단설 정값뿐다니입에 입니다.SECRET_KEY구성 키를 직접 설정할 수 있습니다.

Quickstart의 Sessions 섹션에는 어떤 종류의 서버측 비밀을 설정해야 하는지에 대한 현명한 조언이 있습니다.

암호화는 암호에 의존합니다. 암호화에 사용할 서버 측 암호를 설정하지 않은 경우 모든 사용자가 암호화를 해제할 수 있습니다. 이 암호는 컴퓨터의 암호와 같습니다.암호화 해시 알고리즘을 사용하여 다시 만들기 어려운 값인 서명 문자열을 만드는 데는 암호화 해시 알고리즘을 사용합니다. 동일한 암호를 가지고 있고 원본 데이터를 사용하여 이 값을 다시 만들 수 있는 경우에만 Flask가 허가 없이 변경된 항목이 있는지 탐지할 수 있습니다.이 비밀은 Flask가 클라이언트에게 보내는 데이터에 포함되지 않기 때문에 클라이언트는 세션 데이터를 조작할 수 없으며 유효한 새 서명을 생성하기를 희망합니다.

플라스크는 라이브러리를 사용하여 모든 힘든 작업을 수행하고, 세션은 사용자 정의된 JSON 직렬화기를 사용하여 클래스를 사용합니다.

언급URL : https://stackoverflow.com/questions/22463939/demystify-flask-app-secret-key

반응형