问题描述
我想看看我是否可以在以下场景中保护我的 python 源代码:
- 我正在管理一个 linux 服务器,我是唯一一个拥有 root 权限的人
- 我的用户在此服务器上拥有独立的用户帐户
- 我想找到一种方法在此服务器上安装私有纯 Python 模块,以便我的用户可以导入该模块,他们无法访问代码
有没有办法做这样的事情?
解决方法
听起来您想要一个代码混淆工具,通过重命名变量、函数、模块等,用乱码替换它们的名称,如果没有一些非常专门的逆向工程,代码就会变得不可读。
如果计算机可以执行代码,那么对该计算机具有管理员访问权限的人也可以读取编译后的代码,无一例外。如果你不希望有人窃取你的逻辑,你就混淆了。如果您不希望人们盗版您的软件(无需付费即可使用),您可以添加一些软件保护(研究其他订阅软件的保护方式)并对其进行混淆,这样就很难了绕过限制,明显违反知识产权法。
或者(如果合适,通常是这样),您可能希望在自己的服务器上运行代码并发布 API 供您的客户使用。为方便起见,您还可以开发公共 API 的抽象供客户端使用。这根本不会让客户访问代码;客户端间接要求服务器做某事,如果一切正常(例如,客户端有一个有效的订阅),服务器就会去做。
,看看这个页面: https://www.packagr.app/?ref=Medium
私人包功能每月收费 10 美元。如果您可以支付,请继续此安装过程,链接如下:
https://medium.com/packagr/creating-and-sharing-private-python-packages-151a95e10735
如果您无法支付所要求的价格,还有其他方法可以实现包裹的完全隐私。您可以使用 .pyc 扩展名。这种类型的文件是在本地导入模块时由python自动创建的。该文件的内容是原始模块,但采用字节格式。问题是您不能通过简单地在一行中导入它来执行或“导入”这种文件。要执行此类文件,您需要这样做。
-
拥有您的原始模块源代码,例如:
def abc(): countries = ["United States","Poland","Russia","Portugal","France","Germany"] for country in countries: print(country) if __name__ == "__main__": print("countries")
-
然后将文件编译为 .pyc。这可以使用模块“py_compile”来完成:
py_compile.compile('test.py','mypyc.pyc')
-
那么你应该只向服务器提供这个文件。为了使用它,服务器中的每个用户都需要将此行添加到文件中:
import marshal s = open('mypyc.pyc','rb') s.seek(8) # go past first eight bytes code_obj = marshal.load(s)
-
然后,执行code_obj:
exec(code_obj)
-
终于可以使用模块的功能了。在本例中:
abc()
不过暂时可以看透模块的内容:
print(code_obj)
这使得这东西毫无用处。您可以做的是使用以下方法限制控制台输出:
sudo dmesg -n 1
如果你这样做,你就会限制控制台的每一个输出。因此,您可以强制用户将程序的输出重定向到一个新文件,然后通过 vim 读取该文件。但是,另一个问题出现了,他们可以通过这样做将模块的源代码写入一个新文件:
with open('readme.txt','w') as f:
f.write(code_obj)
然后,您应该创建一个不断运行的 bash 文件,以限制创建开头包含一组特定八个字符的文件。然后,在模块的开头添加这个八字节组合。通过这种方式,您可以防止用户复制模块。可能还有更多可用选项,但我认为这可以解决您的问题。