[python] 파이썬 스크립트에서 비밀번호 숨기기 (안전하지 않은 난독 화만 해당)

ODBC 연결을 생성하는 Python 스크립트가 있습니다. ODBC 연결은 연결 문자열로 생성됩니다. 이 연결 문자열에이 연결의 사용자 이름과 비밀번호를 포함시켜야합니다.

파일 에서이 암호를 숨기는 쉬운 방법이 있습니까 (파일을 편집 할 때 아무도 암호를 읽을 수 없도록)?



답변

Base64 인코딩 은 표준 라이브러리에 있으며 어깨 서퍼를 중지시킵니다.

>>> import base64
>>>  print(base64.b64encode("password".encode("utf-8")))
cGFzc3dvcmQ=
>>> print(base64.b64decode("cGFzc3dvcmQ=").decode("utf-8"))
password


답변

Douglas F Shearer는 원격 로그인 암호를 지정해야 할 때 Unix에서 일반적으로 승인 된 솔루션입니다. –password-from-file 옵션을
추가 하여 경로를 지정하고 파일에서 일반 텍스트를 읽습니다.
파일은 운영 체제에 의해 보호되는 사용자 자신의 영역에있을 수 있습니다. 또한 다른 사용자가 자신의 파일을 자동으로 선택할 수 있습니다.

스크립트 사용자가 알 수없는 비밀번호의 경우, 권한을 높이고 스크립트를 실행하고 해당 루트 / 관리자 사용자가 비밀번호 파일을 소유 할 수 있습니다.


답변

간단한 방법은 다음과 같습니다.

  1. 파이썬 모듈 만들기-peekaboo.py라고하겠습니다.
  2. peekaboo.py에 비밀번호와 해당 비밀번호가 필요한 코드를 모두 포함하십시오.
  3. 이 모듈을 가져 와서 (python 명령 줄 등을 통해) 컴파일 된 버전 (peekaboo.pyc)을 만듭니다.
  4. 이제 peekaboo.py를 삭제하십시오.
  5. peekaboo.pyc에만 의존하여 peekaboo를 행복하게 가져올 수 있습니다. peekaboo.pyc는 바이트 컴파일되므로 일반 사용자는 읽을 수 없습니다.

이것은 py_to_pyc 디 컴파일러에 취약하지만 base64 디코딩보다 조금 더 안전해야합니다.


답변

유닉스 시스템에서 작업하는 경우 표준 Python 라이브러리에서 netrc 모듈을 활용하십시오. 별도의 텍스트 파일 (.netrc)에서 암호를 읽습니다 . 형식은 here 입니다.

다음은 작은 사용 예입니다.

import netrc

# Define which host in the .netrc file to use
HOST = 'mailcluster.loopia.se'

# Read from the .netrc file in your home directory
secrets = netrc.netrc()
username, account, password = secrets.authenticators( HOST )

print username, password


답변

사용자가 런타임에 사용자 이름과 비밀번호를 제공 할 수 없다고 가정하면 가장 좋은 해결책은 기본 코드로 가져 오는 사용자 이름과 비밀번호에 대한 변수 초기화 만 포함하는 별도의 소스 파일 일 것입니다. 이 파일은 자격 증명이 변경 될 때만 편집하면됩니다. 그렇지 않으면 평균 메모리를 가진 어깨 서퍼 만 걱정한다면 base 64 인코딩이 가장 쉬운 솔루션 일 것입니다. ROT13은 수동으로 해독하기가 너무 쉽고 대소 문자를 구분하지 않으며 암호화 된 상태에서 너무 많은 의미를 유지합니다. 파이썬 스크립트 외부에서 비밀번호와 사용자 ID를 인코딩하십시오. 런타임시 스크립트 디코딩을 사용하도록합니다.

자동화 된 작업에 대한 스크립트 자격 증명을 제공하는 것은 항상 위험한 제안입니다. 스크립트에는 자체 자격 증명이 있어야하며 사용하는 계정에는 필요한 것 이외의 액세스 권한이 없어야합니다. 최소한 암호는 길고 임의적이어야합니다.


답변

스크립트 외부의 파일에서 사용자 이름과 비밀번호를 가져 오는 것은 어떻습니까? 그렇게하면 누군가 스크립트를 가지고 있어도 자동으로 암호를 얻지 못할 것입니다.


답변

base64는 간단한 요구를 충족시키는 방법입니다. 아무것도 가져올 필요가 없습니다 :

>>> 'your string'.encode('base64')
'eW91ciBzdHJpbmc=\n'
>>> _.decode('base64')
'your string'