在受控 Linux 服务器上保持 Python 代码私有

Keeping Python Code Private On Controlled Linux Server

我想看看我是否可以在以下情况下保护我的 python 源代码:

  1. 我正在管理一台 linux 服务器,我是唯一拥有 root 权限的服务器
  2. 我的用户在此服务器上已分离用户帐户
  3. 我想找到一种方法在此服务器上安装私有纯 python 模块,以便我的用户可以导入该模块,他们无法访问代码

有没有办法做这样的事情?

查看此页面: https://www.packagr.app/?ref=Medium

私人套餐功能每月收费10美元。如果你能付钱,继续这个安装过程,link如下:

https://medium.com/packagr/creating-and-sharing-private-python-packages-151a95e10735

如果您无法支付要求的价格,还有其他方法可以实现包裹的完全隐私。您可以使用 .pyc 扩展名。当您在本地导入模块时,这种类型的文件由 python 自动创建。该文件的内容是原始模块,但采用字节格式。问题是您不能通过简单地在一行中导入来执行或 'import' 这种文件。要执行此类文件,您需要执行此操作。

  1. 有你的原始模块源代码,例如:

     def abc():
        countries = ["United States", "Poland", "Russia", "Portugal", "France", "Germany"]
        for country in countries:
            print(country)
     if __name__ == "__main__":
        print("countries")
    
  2. 然后你把文件编译成.pyc。这可以使用模块 "py_compile":

    来完成
     py_compile.compile('test.py', 'mypyc.pyc')
    
  3. 那么你应该只向服务器提供这个文件。为了使用它,服务器中的每个用户都需要将这些行添加到他们的文件中:

     import marshal
    
     s = open('mypyc.pyc', 'rb')
     s.seek(8)  # go past first eight bytes
     code_obj = marshal.load(s)
    
  4. 然后,执行code_obj:

     exec(code_obj)
    
  5. 终于可以使用模块的功能了。在这个例子中:

     abc()
    

不过暂时可以通过模块看到的内容:

print(code_obj)

这让这东西没用了。您可以做的是使用以下命令限制控制台输出:

sudo dmesg -n 1

如果这样做,您将限制控制台的每一个输出。因此,您可以强制用户将程序的输出重定向到一个新文件,然后通过 vim 读取该文件。但是,另一个问题出现了,他们可以通过这样做将模块的源代码写入一个新文件:

with open('readme.txt', 'w') as f:
  f.write(code_obj)

然后,您应该创建一个 bash 文件,该文件始终 运行 以限制创建开头包含一组特定八个字符的文件。然后,将这个八字节组合添加到模块的开头。这样,您就可以防止用户复制该模块。可能还有更多选项可用,但我认为这可以解决您的问题。

听起来你想要一个代码混淆工具,如果没有一些非常专门的逆向工程,通过重命名变量、函数、模块等,用乱码替换它们的名称,就可以使代码不可读。

如果一台计算机可以执行代码,那么拥有该计算机管理员权限的人也可以读取编译后的代码,无一例外。如果你不想让别人窃取你的逻辑,你就会混淆。如果你不希望人们盗版你的软件(免费使用它),你可以添加一些软件保护(研究其他订阅软件是如何保护的)并混淆它们,所以很难绕过限制并且明显违反知识产权法。

或者(如果合适,通常是这样),您可能希望 运行 您自己的服务器上的代码并发布一个 API 供您的客户使用。为了方便起见,您还可以开发 public API 的抽象供客户使用。这根本不会让客户访问代码;客户端间接要求服务器做某事,如果一切正常(例如,客户端有一个有效的订阅),服务器就会执行。