[python] 파이썬 코드를 어떻게 보호합니까?

저는 고용주 고객에게 배포 할 Python 소프트웨어를 개발 중입니다. 고용주는 시간 제한 라이센스 파일로 소프트웨어 사용을 제한하려고합니다.

.py 파일 또는 .pyc 파일을 배포하면 라이센스 파일을 확인하는 코드를 쉽게 디 컴파일하고 제거 할 수 있습니다.

또 다른 측면은 제 고용주가 코드를 도난 당하거나 최소한 “새로운 아이디어”를 두려워하여 고객이 코드를 읽는 것을 원하지 않습니다.

이 문제를 처리하는 좋은 방법이 있습니까? 바람직하게는 상용 솔루션입니다.

소프트웨어는 Linux 시스템에서 실행될 것입니다 (그래서 py2exe가 트릭을 할 것이라고 생각하지 않습니다).



답변

바이트 코드 컴파일 된 해석 언어 인 Python은 잠그기가 매우 어렵습니다. py2exe 와 같은 exe-packager를 사용하더라도 실행 파일의 레이아웃은 잘 알려져 있으며 Python 바이트 코드는 잘 알려져 있습니다.

일반적으로 이와 같은 경우에는 상충 관계를 만들어야합니다. 코드를 보호하는 것이 얼마나 중요합니까? 은행 송금의 대칭 암호화를위한 키와 같은 실제 비밀이 있습니까, 아니면 편집증입니까? 최고의 제품을 가장 빨리 개발할 수있는 언어를 선택하고 참신한 아이디어의 가치에 대해 현실적으로 표현하십시오.

실제로 라이센스 검사를 안전하게 시행해야한다고 결정한 경우 라이센스 검사 코드를 리버스 엔지니어링하기가 어려울 수 있지만 불가능하지는 않을 수 있도록 작은 C 확장으로 작성하십시오. .


답변

“이 문제를 처리하는 좋은 방법이 있습니까?” 리버스 엔지니어링으로부터 보호 할 수있는 것은 없습니다. DVD 시스템의 펌웨어조차 리버스 엔지니어링되었으며 AACS 암호화 키가 노출되었습니다. DMCA가 범죄를 저지르고 있음에도 불구하고 말입니다.

기술적 인 방법으로 고객이 코드를 읽는 것을 막을 수 없으므로 일반적인 상업적 방법을 적용해야합니다.

  1. 라이센스. 계약. 이용 약관. 사람들이 코드를 읽을 수있는 경우에도 여전히 작동합니다. 일부 Python 기반 구성 요소는 해당 구성 요소를 사용하여 소프트웨어를 판매하기 전에 요금을 지불해야 할 수도 있습니다. 또한 일부 오픈 소스 라이센스로 인해 해당 구성 요소의 소스를 숨길 수 없습니다.

  2. 중요한 가치를 제공하십시오. 거부하기 어려운 가격으로 물건이 너무 좋으면 시간과 돈을 낭비하는 엔지니어링 인센티브가 없습니다. 리버스 엔지니어링은 비싸다. 제품을 약간 저렴하게 만드십시오.

  3. 리버스 엔지니어링을 나쁜 생각으로 만드는 업그레이드 및 개선 사항을 제공하십시오. 다음 릴리스에서 리버스 엔지니어링이 중단되면 아무런 의미가 없습니다. 이것은 터무니없는 극단적으로 수행 할 수 있지만 리버스 엔지니어링보다 다음 릴리스를 더 가치있게 만드는 새로운 기능을 제공해야합니다.

  4. 사용자가 비용을 지불 할만큼 매력적인 속도로 사용자 정의를 제공하면 개선 된 기능을 구축하고 지원할 수 있습니다.

  5. 만료되는 라이센스 키를 사용하십시오. 이것은 잔인하고 나쁜 평판을 주지만 소프트웨어 작동을 확실히 중지시킵니다.

  6. 웹 서비스로 제공하십시오. SaaS는 고객에게 다운로드하지 않습니다.


답변

파이썬은 필요한 도구가 아닙니다

올바른 도구를 사용하여 올바른 작업을 수행해야하며 Python은 난독 화되도록 설계되지 않았습니다. 그것은 반대로입니다. 언어 철학이기 때문에 파이썬에서 모든 것이 공개되거나 공개되거나 수정되기 쉽습니다.

보이지 않는 것을 원하면 다른 도구를 찾으십시오. 이것은 나쁜 일이 아니며, 사용법에 따라 여러 가지 도구가 존재하는 것이 중요합니다.

난독 화는 정말 어렵다

컴파일 된 프로그램조차 리버스 엔지니어링 될 수 있으므로 코드를 완전히 보호 할 수 있다고 생각하지 마십시오. 난독 처리 된 PHP를 분석하고 플래시 암호화 키를 깰 수 있습니다. 최신 버전의 Windows는 매번 크랙됩니다.

법적 요구 사항을 갖는 것이 좋습니다.

누군가가 코드를 잘못 사용하는 것을 막을 수는 없지만 누군가가 쉽게 코드를 발견 할 수 있습니다. 따라서 이는 단순한 법적 문제입니다.

코드 보호가 과대 평가되었습니다

오늘날 비즈니스 모델은 제품 대신 서비스를 판매하는 경향이 있습니다. 서비스를 복사하거나 해적하거나 도용 할 수 없습니다. 아마도 흐름과 함께 갈 시간입니다 …


답변

파이썬을 컴파일하고 바이너리를 배포하십시오!

현명한 아이디어 :

사용 사이 썬 , Nuitka은 , 피부 헛간 다음 대신 파이썬 바이너리 라이브러리 (PYD)로 응용 프로그램을 배포, 또는 C 코드를 컴파일 파이썬 비슷한.

그렇게하면 파이썬 (바이트) 코드가 남지 않으며 누구나 (예 : 고용주) 일반 코드에서 기대할 수있는 합리적인 양의 모호함을 수행했습니다. 바이트 코드는 난독 화되지 않고 비교적 쉽게 적절한 소스로 디 컴파일 될 수 있으므로 .NET 또는 Java는이 경우보다 안전하지 않습니다.

Cython은 CPython과 점점 더 호환되고 있으므로 작동해야한다고 생각합니다. (실제로이 제품을 고려하고 있습니다 .. 이미 일부 타사 라이브러리를 pyd / dll로 빌드하고 있으므로 바이너리 코드로 자체 파이썬 코드를 제공하는 것은 우리에게 큰 단계가 아닙니다.)

사용 방법에 대한 자습서는 이 블로그 게시물 (나가 아님)을 참조하십시오 . (thx @hithwen)

미친 생각 :

Cython이 각 모듈에 대해 C 파일을 개별적으로 저장하도록 한 다음 모두 연결하고 무거운 인라인으로 빌드 할 수 있습니다. 그렇게하면 파이썬 모듈은 매우 모 놀리 식이며 일반적인 도구로는 칩을 만들기가 어렵습니다.

미치게 :

Python 런타임 및 모든 라이브러리 (dll)에 정적으로 링크 (및 최적화) 할 수있는 경우 단일 실행 파일을 빌드 할 수 있습니다. 그렇게하면 파이썬과 호출하는 프레임 워크 라이브러리와 호출하는 것을 가로 채기가 어려울 것입니다. LGPL 코드를 사용하는 경우에는 수행 할 수 없습니다.


답변

고객이 파이썬의 힘을 사용하기를 원하지만 소스 코드를 노출하고 싶지는 않습니다.

내 제안은 다음과 같습니다.

(a) 중요한 코드를 C 또는 C ++ 라이브러리로 작성한 다음 SIP 또는 swig 를 사용 하여 C / C ++ API를 Python 네임 스페이스에 노출하십시오.

(b) Python 대신 cython 을 사용하십시오.

(c) (a)와 (b) 모두에서 파이썬 인터페이스를 사용하여 라이브러리를 라이센스 바이너리로 배포 할 수 있어야합니다.


답변

고용주는 다른 사람들이 귀하의 코드에서 얻은 아이디어를 “훔칠”수 있다는 것을 알고 있습니까? 그들이 당신의 일을 읽을 수 있다면 당신도 할 수 있습니다. 어쩌면 상황에서 이익을 얻을 수 있는지 살펴보면 잃을 수있는 금액을 두려워하는 것보다 투자 수익률이 높아질 것입니다.

[편집] Nick의 의견에 대한 답변 :

아무것도 얻지 못했습니다. 고객은 자신이 원하는 것을 가지고 있습니다 (그리고 자신이 변경을 한 이후에 지불했습니다). 그는 변경 사항을 공개하지 않기 때문에 다른 사람에게는 일어나지 않은 것처럼 보입니다.

이제 고객이 소프트웨어를 판매하는 경우 저작권 표시를 변경해야합니다 (불법이므로 귀하는 소송을 제기하여 이길 수 있습니다-> 간단한 경우).

고객이 저작권 고지 사항을 변경하지 않으면 2 단계 고객은 소프트웨어가 원본에서 나온 것을보고 무슨 일이 일어나고 있는지 궁금해 할 것입니다. 그들이 당신에게 연락 할 것이므로 당신은 당신의 작품의 재판매에 대해 배울 것입니다.

다시 한 번 우리는 두 가지 경우가 있습니다. 원래 고객은 몇 부만 판매했습니다. 그것은 그들이 어쨌든 많은 돈을 벌지 않았다는 것을 의미합니다. 또는 그들은 대량으로 판매되었습니다. 그것은 그들이하는 일에 대해 배우고 그것에 대해 무언가를 할 수있는 더 좋은 기회를 의미합니다.

그러나 결국 대부분의 회사는 법을 준수하려고 시도합니다. 일단 명성이 떨어지면 사업을하기가 훨씬 더 어렵습니다. 그래서 그들은 당신의 일을 훔치지 않고 그것을 개선하기 위해 당신과 함께 일합니다. 따라서 소스를 포함하면 (간단한 재판매를 방지하는 라이센스가있는 경우) 변경 사항이 다음 버전에 있는지 확인할 수 있기 때문에 변경 사항을 간단히 취소 할 수 있습니다. . 그것은 상생입니다 : 당신은 변경 사항을 받고 공식 릴리스에 포함시키지 않으려는 경우에도 필사적으로 변경이 필요한 경우 스스로 변경할 수 있습니다.


답변

pyminifier를 살펴 보셨습니까 ? 파이썬 코드를 축소, 난독 화 및 압축합니다. 예제 코드는 캐주얼 리버스 엔지니어링에는 매우 불쾌합니다.

$ pyminifier --nonlatin --replacement-length=50 /tmp/tumult.py
#!/usr/bin/env python3
ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲמּ=ImportError
ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ燱=print
ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?=False
ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ澨=object
try:
 import demiurgic
except ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲמּ:
 ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ燱("Warning: You're not demiurgic. Actually, I think that's normal.")
try:
 import mystificate
except ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲמּ:
 ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ燱("Warning: Dark voodoo may be unreliable.")
ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲﺬ=ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?
class ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?(ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ澨):
 def __init__(self,*args,**kwargs):
  pass
 def ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ클(self,dactyl):
  ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ퐐=demiurgic.palpitation(dactyl)
  ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?=mystificate.dark_voodoo(ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ퐐)
  return ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?
 def ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?(self,whatever):
  ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ燱(whatever)
if __name__=="__main__":
 ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ燱("Forming...")
 ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲﺃ=ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?("epicaricacy","perseverate")
 ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲﺃ.ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?("Codswallop")
# Created by pyminifier (https://github.com/liftoff/pyminifier)