python - 如何在 Python 代码中隐藏用户名/密码?

标签 python security

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

最佳答案

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

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


你不能在不给他们 key 的情况下给他们加密的密码。所以加密强度几乎无关紧要。对他们来说,恢复 key 几乎总是比破解密码更容易——对他们来说,只需在 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。如果是,那就去做;这真的没关系。

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

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


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

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

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

这不会阻止他们在没有客户端的情况下访问您,但是,如果操作得当,他们将无法访问。

关于python - 如何在 Python 代码中隐藏用户名/密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18792537/

相关文章:

python - Pandas :计算每组行内的正弦距离

python - 创建新文件的函数

.net - .NET 中的多方加密?

安全测试 - 如何测试恶意上传文件上传功能

python Fabric : filter out server output when capturing output of run()

python - 将变量类型转换为 unicode 字符串

python在不重复的情况下打印字符串中的常见项目

security - PHP用户管理系统

java - 如何在 Java Applet 中保存一些配置信息?

PHP - 停止显示错误的完整路径