매일 업데이트
2023-08-17 07:40 6 min

Pyarmor를 사용하여 리버스 엔지니어링으로부터 Python 스크립트 보호

Python은 뛰어난 가독성과 광범위한 활용도를 자랑합니다. 이러한 장점은 협업을 촉진하지만, 동시에 무단 접근과 오용의 위험을 높이기도 합니다. 경쟁 업체나 악의적인 사용자는 적절한 보호 조치가 없다면 알고리즘이나 독점적인 로직을 손쉽게 복제할 수 있습니다. 이는 소프트웨어의 무결성을 손상시키고, 사용자 신뢰를 저해하는 결과를 초래할 수 있습니다.

오늘의 MUO 비디오

콘텐츠를 계속 보려면 아래로 스크롤하십시오.

난독화 및 라이선스 검증과 같은 강력한 보안 대책을 적용하면, 잠재적인 위협으로부터 소프트웨어를 효과적으로 보호할 수 있습니다. Python 스크립트를 보호하는 것은 단순한 실천을 넘어, 혁신의 기밀성을 유지하고, 디지털 환경에서 사용자의 신뢰를 지키는 데 핵심적인 전략입니다.

Pyarmor에 대한 이해

Pyarmor는 Python 스크립트와 패키지를 보호하고 난독화하는 데 사용되는 명령줄 라이브러리입니다. 이 도구는 원래 Python 코드를 기능은 유지하면서 이해하기 어려운 형태로 변환합니다. 난독화 과정에서 변수, 함수, 클래스 이름은 의미 없는 이름으로 바뀌고, 주석이 제거되며, 코드가 재구성됩니다. 이러한 변화는 코드를 리버스 엔지니어링하거나, 변조하거나, 복제하는 것을 훨씬 어렵게 만듭니다.

Pyarmor는 개별 Python 스크립트뿐만 아니라 전체 패키지 보호를 지원하며, 코드에 라이선스 검증 기능을 추가하는 것도 가능합니다.

Pyarmor 라이브러리 설치

Pyarmor는 Python Package Index(PyPI)에 등록되어 있으며, pip를 사용하여 간단하게 설치할 수 있습니다. 다음 명령어를 실행하여 설치를 진행하십시오.

 pip install pyarmor

Pyarmor를 프로젝트가 위치한 디렉토리에 반드시 설치해야 하는 것은 아닙니다. 컴퓨터 내 어디든 설치할 수 있으며, 어느 디렉토리에서든 Python 스크립트를 보호할 수 있습니다.

그러나 보안 처리된 스크립트를 실행하기 위해 대상 시스템에 Pyarmor를 설치하지 않으려면, 프로젝트를 호스팅하는 디렉토리와 동일한 위치에 Pyarmor를 설치해야 합니다. 이는 보안 스크립트에 실행에 필요한 Pyarmor 런타임에 대한 참조가 포함되어 있기 때문입니다.

개별 Python 스크립트 보안

Pyarmor를 사용하여 개별 스크립트를 보호하는 과정은 매우 간단합니다. 아래 예시는 두 숫자를 더하는 간단한 스크립트입니다.

 def add_numbers(num1, num2):
   result = num1 + num2
   print("The sum of {} and {} is: {}".format(num1, num2, result))


num1 = float(input("Enter the first number: "))
num2 = float(input("Enter the second number: "))
add_numbers(num1, num2)

명령줄을 사용하여 Pyarmor가 설치된 디렉토리로 이동한 후, 다음 명령어를 실행하여 스크립트를 암호화하고 난독화합니다. 'main.py'는 실제 스크립트 이름으로 대체해야 합니다.

 pyarmor gen --output dist main.py

명령어가 실행되면, Pyarmor는 'dist'라는 새로운 폴더를 생성하고, 그 안에 보안 처리된 스크립트가 저장됩니다.

보안 스크립트의 내용을 확인하려면 해당 파일을 열어보십시오.

위 스크린샷은 Pyarmor가 간단한 덧셈 스크립트를 난독화 및 암호화한 결과입니다. 이제 스크립트 내용을 보는 것만으로는 그 기능을 파악하기 어렵습니다.

보안 스크립트를 실행하려면 터미널이나 명령 프롬프트를 열고 'dist' 디렉토리가 있는 위치로 이동합니다. 그런 다음 다음 명령어를 사용하여 스크립트를 실행합니다.

 python dist/main.py 

'main.py'는 실제 스크립트 이름으로 대체해야 합니다. 스크립트는 난독화 처리 이전과 동일하게 실행되어야 합니다. 모든 기능이 예상대로 작동하는지 철저히 검증하십시오.

전체 Python 패키지 보호

패키지는 목적에 따라 몇 개의 모듈부터 수백 개의 모듈까지 포함할 수 있습니다. 각 모듈을 개별적으로 보호하는 것은 매우 번거로운 작업입니다. 다행히 Pyarmor는 각 모듈을 따로 지정하지 않고도 전체 패키지를 보호할 수 있는 기능을 제공합니다.

다음과 같은 구조를 가진 'sample_package'라는 간단한 Python 패키지가 있다고 가정해 보겠습니다.

 sample_package/
|-- __init__.py
|-- module1.py
|-- module2.py

필요에 따라 더 많은 모듈을 만들 수 있습니다.

패키지를 암호화하고 난독화하려면 터미널이나 명령 프롬프트를 열고 패키지가 있는 디렉토리로 이동합니다. 그 다음, 다음 명령어를 실행하십시오.

 pyarmor gen -O dist -r -i sample_package 

'sample_package'를 실제 패키지 이름으로 바꿔주세요. 이 명령어는 패키지 디렉토리를 암호화 및 난독화하고, 보호된 결과물을 'dist' 디렉토리에 저장합니다. 보호된 패키지는 일반적인 Python 패키지와 동일한 방식으로 사용할 수 있습니다.

예를 들어, 위 샘플 패키지를 사용하려면 'dist' 디렉토리 내에 새로운 스크립트를 생성하십시오.

 from my_package import module1, module2

module1.say_hello()
module2.do_something()

코드를 실행했을 때, 패키지는 보안 처리 이전과 동일하게 동작해야 합니다.

스크립트에 대한 접근 제어

사용자가 스크립트를 실행할 수 있는 기간을 제한할 수 있습니다. 예를 들어, 시험 기간과 같이 특정 기간 동안만 스크립트를 사용하도록 할 수 있습니다.

스크립트 실행 기간을 제한하려면 스크립트 난독화 시 다음 명령어를 사용하십시오.

 pyarmor gen -O dist -e 30 main.py 

'30'은 스크립트를 활성화할 일수로 대체하십시오. 정확한 날짜를 지정할 수도 있습니다. 지정된 기간이 지나면 스크립트는 만료됩니다.

과거 날짜를 설정하여 이 기능을 테스트해볼 수 있습니다. 이렇게 하면 스크립트 실행 시 오류가 발생합니다. 다음 명령어를 사용하여 만료 날짜가 설정된 스크립트를 난독화합니다.

 pyarmor gen -O dist -e 2022-01-01 main.py

그 후, 보안 처리된 스크립트를 실행해 보십시오.

오류 메시지는 라이선스 키가 만료되어 스크립트를 실행할 수 없음을 나타냅니다.

보안과 효율성의 균형

Pyarmor는 코드 보안을 강화하기 위한 강력한 난독화 메커니즘을 제공하지만, 보안 조치와 소프트웨어의 효율성 및 성능을 유지하는 것 사이의 균형을 맞추는 것이 중요합니다. 다음 사항을 통해 이를 달성할 수 있습니다.

  • 난독화 필요성 평가: 소프트웨어에 독점 알고리즘, 민감한 데이터 또는 고유한 비즈니스 로직이 포함되어 있다면 난독화는 매우 유용합니다. 그러나 지적 재산권에 대한 우려가 적은 오픈 소스 스크립트의 경우, 보안과 성능 사이의 균형을 효율성 측면에 더 가깝게 조정해야 합니다.
  • 성능 영향 평가: 난독화는 코드에 추가 작업 및 변환을 적용하기 때문에 런타임 오버헤드를 발생시킵니다. 이러한 영향은 작은 스크립트에서는 무시할 만하지만, 대규모 프로젝트에서는 더 두드러질 수 있습니다. 난독화가 성능에 미치는 영향을 신중하게 평가하고 테스트를 통해 소프트웨어의 반응성과 효율성을 유지해야 합니다.
  • 정기적인 업데이트 및 유지 관리 실시: 난독화된 코드, 라이선스, 보안 메커니즘을 주기적으로 업데이트하여 잠재적인 취약점에 선제적으로 대응해야 합니다. 사용자에게 미치는 중단을 최소화해야 할 필요성과 균형을 맞추는 것이 중요합니다.

난독화된 코드를 해독할 수 있을까요?

소프트웨어 크래킹은 소프트웨어 응용 프로그램의 복사 방지 또는 라이선스 메커니즘을 제거하는 행위를 의미합니다. 이를 통해 비용을 지불하지 않고 모든 기능에 대한 무단 접근 권한을 얻을 수 있습니다. 소프트웨어를 난독화한다고 해서 크래커로부터 완벽하게 보호되는 것은 아니라는 점을 명심해야 합니다.

충분한 동기와 자원이 있다면, 난독화된 코드를 해독하는 것이 가능할 수 있습니다. 그러므로 정기적인 업데이트와 유지 관리를 통해 잠재적인 취약점을 해결하는 것이 중요합니다.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.