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

时间:2013-09-13 18:04:11

标签: python security

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

5 个答案:

答案 0 :(得分: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调用会立即验证并添加两个记录。然后让客户端访问该中间件而不是直接访问数据库,窃取客户端凭据的任何人仍然无法添加无效的Shipping记录。

这不会阻止他们在没有客户端的情况下访问你,但是,如果做得好,它将使他们无法做到这一点。

答案 1 :(得分:4)

import base64

p ='所需密码'

y = base64.b64encode(p)

打印y

如果你想解码y:

z = base64.b64decode(y)

print z

答案 2 :(得分:3)

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

  1. 使用您的应用打包数据,sqlite db文件可轻松打包
  2. 通过某种API公开您的应用程序逻辑并分发客户端,该客户端使用api与您的应用程序通信,因此客户端将永远不必知道任何数据库凭据
  3. 为客户创建具有正确权限的mysql用户帐户

答案 3 :(得分:2)

无论你使用py2exe编译可执行文件,或者对它进行模糊处理等,都可能是最难隐藏的字符串。实际上,你不能从客户端“隐藏”连接字符串。当然,您可以加密它们,但是您需要一种解密它们的方法,客户端可以轻松(相对)自己解密用户名和密码。

答案 4 :(得分:0)

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