2. [pywin32] CryptProtectData 함수

pywin32/win32crypt|2020. 8. 9. 23:28

bytes = CryptProtectData(DataIn, DataDescr , OptionalEntropy , Reserved , PromptStruct , Flags )

 

데이터를 암호화 해주는 함수입니다. 암호화 과정 중 사용자의 정보를 이용하기 때문에 다른 사용자가 복호화를 하지 못합니다.

 

인자로는 DataIn : bytes, DataDescr=None : PyUnicode,OptionalEntropy=None : bytes, Reserved=None : None, PromptStruct=None : PyCRYPTPROTECT_PROMPTSTRUCT, Flags=0 : int 가 있습니다.

 

DataIn은 암호화 대상 데이터입니다.

 

DataDescr는 데이터에 대한 설명으로 DataIn에 합쳐져서 암호화가 됩니다. 기본값은 None입니다.

 

OptionalEntropy는 데이터 암호화를 더 복잡하게 만드는 값으로 패스워드로 보셔도 됩니다. 기본값은 None입니다.

 

Reserved는 지금은 쓰지 않지만 언제가 사용할 때를 대비한 인자로써 반드시 None이여야 합니다.

 

PromptStruct는 UI를 위한 옵션으로 PyCRPYTPROTECT_PROMPTSTRUCT 구조체를 사용합니다.

* PyCRPYTPROTECT_PROMPTSTRUCT 은 3개의 자료를 갖는 튜플형 변수입니다.

[0] int : flags

 - CRYPTPROTECT_PROMPT_PROTECT = 0x1

 - CRYPTPROTECT_PROMPT_UNPROTECT = 0x2

 - 위 2개의 인자값의 컴비네이션을 플래그로 갖습니다. 근데 제가 아무리 써봐도 무슨 차이가 있는지 모르겠습니다;;

 

[1] int : hwndApp

 - 부모 프로세스의 핸들로 0으로 두시면 됩니다.

 

[2] PyUnicode : prompt

  - UI 프롬프트 창의 이름입니다. None으로 두셔도 상관없습니다.

 

Flags는 암호화 옵션입니다.

Flags 설명
CRYPTPROTECT_LOCAL_MACHINE = 0x4 위에서 CryptProtectData는 사용자의 정보로 암호화를 하기 때문에 다른 사용자가 복호화를 하지 못한다고 했습니다. 이 Flag를 적용하면, 사용자의 정보가 아니라 컴퓨터의 정보를 이용하기 때문에 다른 사용자로 로그인해도 복호화가 가능합니다.
CRYPTPROTECT_UI_FORBIDDEN = 0x1 PromptStruct를 통해 UI 창을 호출할 수 있었는데 이 Flag가 활성화되있으면, PromptStruct 설정 시 에러가 발생합니다.(UI 금지)
CRYPTPROTECT_AUDIT = 0x10 암복호화 시 감사 로그를 발생시키게 합니다. 근데 이건 감사로그 정책 설정이 필요합니다. 밑에서 설명하겠습니다.

* 암복호화시 감사 로그를 남기기 위한 설정입니다.

저 같은 경우에는 gpedit.msc를 통해서 설정했습니다.

위 이미지의 경로에서 DPAPI 작업 감사를 성공 및 실패로 변경하면 됩니다.

 

import win32crypt

promptStruct = (0x1, 0, "hello")

eData = win32crypt.CryptProtectData(b"text", "description", None, None, promptStruct, 0x10)
# 감사 로그 남김
print(f"{eData}")

위의 프롬프트 창이 뜨고

 

암호화 결과가 출력됩니다.

 

이벤트 로그의 보안 로그를 보면 감사 로그도 남겨져 있습니다.

반응형

'pywin32 > win32crypt' 카테고리의 다른 글

3. [pywin32] CryptUnprotectData 함수  (0) 2020.08.09
1. [pywin32] win32crypt 소개  (0) 2020.08.09

댓글()