4

我有一段 python 代码,它使用 MySQLdb 连接到数据库。用户名/密码以纯文本形式存在于脚本中。我想将此代码交付给客户,但不希望他们知道用户名/密码。最好的方法是什么?如果MySQLdb模块也可以打包,那就更好了。让我们假设它在 Linux 上,并且客户端有标准的 Python 解释器。它不需要超级安全,不以明文形式公开用户名/密码就足够了。客户端需要对我们的数据库具有写入权限。但是写入操作只能来自我们的程序,我们不希望客户端以任意方式写入。

4

5 回答 5

4

出于 Erik A. Brandstadmoen 解释的原因,通常情况下,混淆密码是一个非常糟糕的主意。这正是每个 DRM 解决方案(DVD-CSS、蓝光 HDCP、Flash RTMPE 等)最终失败的原因。另一方面,有时出于商业或法律原因需要,这正是最初发明所有这些 DRM 解决方案的原因。

你说,“它不需要超级安全,不以明文形式公开用户名/密码就足够了。” 听起来您与客户建立了某种合同关系。您不需要真正阻止他们这样做是完全合理的,您只是想强迫他们做出足够的努力来证明他们对他们的恶意或其他事情。这显然是您需要获得法律建议的事情 - 否则,您将浪费精力构建不足以为您提供任何法律保护的东西,或者浪费更多的精力来构建远远超过您想要的法律保护所需的东西. 但是让我们假设你已经得到了法律建议,现在你想继续。


如果不给他们密钥,你就不能给他们一个加密的密码。所以加密的强度几乎是无关紧要的。对他们来说,恢复密钥几乎总是比破解密码更容易——他们甚至更容易在 mysqldb 登录函数上设置一个断点并即时捕获解密的值。这意味着您不妨使用一些非常便宜且非常简单的东西。例如:

def xor(text, key):
    infkey = itertools.chain.from_iterable(itertools.repeat(key))
    return ''.join(chr(ord(a) ^ ord(b)) for a, b in zip(text, infkey))

user = 'user'
encrypted_passwd = '\x1b\x04\x0a\x18\x12\x16\x19\x01'
key = 'key'

do_login(user, xor(encrypted_passwd, key))

您的律师可能会说 XOR 加密不足以“尽最大努力”保护您的数据,您必须使用 AES 等。如果是这样,那就去做;真的没关系。

接下来,担心将密钥和加密密码(可能还有 xor 函数)隐藏在代码中的某处:将它们重命名为无害的东西,将它们嵌入到其他东西的中间,不要让它明显被使用创建密码等

您可能还想保护 MySQL 登录功能的接口。例如,如果您将解密代码和它们mysql_connect一起包装在一个简单的 Cython 扩展中,它们不能只是中断mysqldb.connect或什至_mysql.mysql_connect,这仅意味着它们需要 C 级调试器而不是 Python 级调试器。您甚至可以在解密和连接代码周围使用 C 或二进制混淆器;市面上有许多商业产品,如果你的律师说你需要这样做,你最好使用知名的、最先进的产品,而不是任何定制的产品。


同时,如果您正在寻求技术保护而不是法律保护,您通常可以通过减少暴露而不是试图避免暴露来获得更多好处,正如 dm03514 的回答所建议的那样:限制客户端的访问,因此即使用户窃取客户的凭据,他们只能做他们本可以对客户做的事情。

例如,假设您想阻止用户在未添加具有正确链接的相应帐单记录的情况下添加新的运输记录。您在客户端中有逻辑来验证这一点,但如果他们只是从客户端获取密码,他们可以添加他们想要的所有运输记录。

只需将该逻辑移至某个中间件,这样一个 API 调用就可以同时验证并添加两条记录。然后让客户端访问该中间件而不是直接访问数据库,任何窃取客户端凭据的人仍然无法添加无效的运输记录。

这不会阻止他们在没有客户端的情况下访问您,但是,如果操作正确,他们这样做将毫无用处。

于 2013-09-13T19:12:59.147 回答
4

导入base64

p = '想要的密码'

y = base64.b64encode (p)

打印 y

如果你想解码 y:

z = base64.b64decode (y)

打印 z

于 2015-05-31T21:33:39.557 回答
3

您可以采取各种措施来避免这种情况,其中包括:

  1. 使用您的应用程序打包您的数据,sqlite db 文件很容易打包
  2. 通过某种 API 公开您的应用程序逻辑并分发一个客户端,该客户端使用该 api 与您的应用程序进行通信,因此客户端将永远不必知道任何数据库凭据
  3. 为您的客户创建一个具有正确权限的 mysql 用户帐户
于 2013-09-13T18:08:49.607 回答
2

字符串可能是最难隐藏的东西,无论您使用 py2exe 编译可执行文件或对其进行混淆等操作。实际上,您无法从客户端“隐藏”连接字符串。当然,您可以加密它们,但是您需要一种解密它们的方法,并且客户端可以轻松(相对)自己解密用户名和密码。

于 2013-09-13T18:09:24.993 回答
1

我认为最好在数据库上为他们设置一个帐户,并使用数据库权限控制对数据库的访问。

于 2013-09-13T18:09:41.140 回答