在受控 Linux 服务器上保持 Python 代码的私密性

问题描述

我想看看我是否可以在以下场景中保护我的 python 源代码

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

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

解决方法

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

如果计算机可以执行代码,那么对该计算机具有管理员访问权限的人也可以读取编译后的代码,无一例外。如果你不希望有人窃取你的逻辑,你就混淆了。如果您不希望人们盗版您的软件(无需付费即可使用),您可以添加一些软件保护(研究其他订阅软件的保护方式)并对其进行混淆,这样就很难了绕过限制,明显违反知识产权法。

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

,

看看这个页面: https://www.packagr.app/?ref=Medium

私人包功能每月收费 10 美元。如果您可以支付,请继续此安装过程,链接如下:

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

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

  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 文件,以限制创建开头包含一组特定八个字符的文件。然后,在模块的开头添加这个八字节组合。通过这种方式,您可以防止用户复制模块。可能还有更多可用选项,但我认为这可以解决您的问题。