如何保护我的Python程序

时间:2013-03-01 07:34:58

标签: python html css server-side

我想要做的是保护Python程序不被没有计算机知识的人窃取。我接受程序被盗版的必然性,我想做的就是保护它免受普通用户的侵害。

我提出了两个想法。 1.)通过在线检查日期和时间来设置时间限制。 I.E.下载时间10天。 2.)检查下载它的计算机的IP或名称,并使程序仅在该计算机上运行。 (以防止朋友简单地共享文件)。

这两个问题是我需要“动态”创建一个.py文件,然后使用像pytoexe这样的东西将它变成.exe,这样用户就不需要Python了安装。

第二个问题是我理解ip的变化并获取计算机名称存在安全风险,可能会吓跑用户。

总结一下,这是我的两个问题: 1.)在python中有一个好方法只允许程序在那台计算机上运行吗? 2.)实现exe的“动态”创建的最佳方法是什么? (我打算在我的电脑上托管网站并学习php(?)/ servers。

我有中等程度的c / c ++和基本的html / css,java和python经验。

感谢您的时间!

4 个答案:

答案 0 :(得分:4)

凌乱的生意。您可能已经明白编译并不意味着加密

但是,如果你是老板认为c编译满意,你可以使用cython将你的python代码编译为c代码,然后使用gcc编译c代码。

点击此处查看如何构建setup.py脚本。

http://docs.cython.org/src/reference/compilation.html#compiling-with-distutils

您可以使用--embed选项将python嵌入到生成的c代码中:

# will generate the target.c 
$ cython target.py --embed

答案 1 :(得分:1)

为每个用户提供一个具有唯一键的自定义安装程序。当它运行时,它会联系服务器(使用密钥)并请求实际程序。在服务器端,检查密钥是否有效,如果是,请提供使用密钥自定义的程序,并将密钥标记为已使用。安装程序将程序保存在用户可以访问的某个位置,并创建一个隐藏文件,其中包含计算机内部某处的密钥,“普通用户”不会想到它。程序运行时,它首先要做的是检查隐藏文件是否存在以及它是否包含正确的密钥,如果没有则拒绝运行。

(我假设解压缩可执行文件并阅读源代码超出了“普通用户”的能力(读取:“grandma”),所以使用py2exe就可以了。)

答案 2 :(得分:0)

为避免与互联网上的任何内容联系,您可以使用以下方式“加密”您的程序:

  • 参加你的计划的重要部分(没有其他的东西,其余的将没用),
  • 把它放进一个字符串,
  • 使用将运行的计算机的MAC address对称地加密该字符串,
  • 然后在你的程序中执行此操作:
    • 使用当前计算机的MAC地址和
    • 解密该字符串
    • 使用exec调用解密的字符串。

重要部分为print "hello world"的示例:

def getMyMac():
  return 123456789L  # for testing now
  return uuid.getnode()  # this would be the real thing

def strxor(s, key):
  key *= len(s) / len(key) + 1
  return ''.join(chr(ord(key[i]) ^ ord(s[i])) for i in range(len(s)))

def performVitalCode():
  code = 'A@ZZA\x16\x15P\\]^\\\x14BYET]\x13'
  # I found that code by entering:
  # strxor('print "hello world"', str(getMyMac()))
  realCode = strxor(code, str(getMyMac()))
  exec realCode
  • 我在这里使用一个简单的xor字符串进行加密(这不是一个难以破解的密码)。
  • 当然,“允许”计算机的用户可以将他的MAC地址移交给下一个用户
    • 可以修补getMyMac()
    • 欺骗自己的MAC地址;大多数网卡都允许这样做。

所以这不是解决问题的“安全”方法。

但是,如果一个只有很少计算机知识的人将你的代码提供给其他人而没有任何进一步的信息(可能是通过将其放在论坛或类似网站上),接收者将无法开箱即用

最后,我需要指出的是,每个代码链接到特定计算机都可能成为代码合法用户的麻烦。如果我使用的程序因为切换到不同的硬件而停止工作(可能只是因为我得到了一台新的笔记本电脑),我通常会生气并诅咒该代码的作者。您可能不想惹恼您的客户。

答案 3 :(得分:0)

这似乎是一件事情的组合。像其他人所建议的那样封装python是捆绑的好方法。您也可以考虑混淆,正如另一个StackOverflow线程中所述:

Python Code Obfuscation

参考文献:

http://freecode.com/projects/pyobfuscate

至于制作它以便有人不能只是下载你的程序并在其他地方运行或分发它,你是否愿意给最终用户带来不便? :)

正如其他人已经提到的那样,您可以使用特定于用户的ID生成编译和捆绑的代码。这样,如果/当应用程序打电话回家时,您可以跟踪使用情况。

如果您的最终用户/客户满足以下要求:

  • 您的帐户,他们可以登录并查看其订阅/帐户状态
  • 运行程序的计算机的Internet连接

您可以使安装过程执行以下操作:

  • 安装程序不是完整程序。生成机器的配置文件。
  • 捆绑了此配置文件并生成哈希。两者都上传到您的服务器。
  • 一旦他们登录了他们的在线网络帐户,就会向最终用户显示哈希值。
  • 安装应用程序的用户提交哈希值,并获取下载链接和解锁密钥。关键只适用于动态生成的下载,并且只适用于该机器。但是,下载的程序将接受一系列独有的键(迭代生成等)。
  • 然后,用户可以完成安装并运行他们的程序。程序将定期检查它所在机器的配置文件,以确保散列不会偏离。如果是,则程序可以提示他们登录其Web帐户以生成新密钥。然后使用新密钥刷新其应用程序。这可以通过应用程序自动完成,但是根据互联网法律规定,让用户登录他们的帐户并且可能同意对EULA进行任何更新,会更好。

如果他们决定在VM捆绑包中共享该程序,他们仍然需要一个活动帐户来获取密钥。

注意,这并不妨碍某人绕过哈希检查。但对于普通用户来说,这将成为阻止人们放弃或转售您的计划的好方法。

请记住,没有一个系统是万无一失的。