在 Python 中混淆字符串

Posted

技术标签:

【中文标题】在 Python 中混淆字符串【英文标题】:Obfuscate strings in Python 【发布时间】:2010-11-02 04:58:54 【问题描述】:

我有一个必须传递给方法的密码字符串。一切正常,但我不习惯以明文形式存储密码。有没有办法混淆字符串或真正加密它?我知道混淆可以被逆向工程,但我认为我至少应该尝试掩盖密码。至少它不会被索引程序看到,或者让杂散的眼睛快速查看我的代码。

我知道 pyobfuscate 但我不希望整个程序被混淆,只有一个字符串,可能是定义变量的整行本身。

目标平台是 GNU Linux Generic(如果有区别的话)

【问题讨论】:

如果您需要真正的、适当的加密,请查看bcryptpy-bcrypt 更具体。要了解为什么要使用它,请阅读 Paul Buchet 的文章,paulbuchheit.blogspot.com/2007/09/…。 【参考方案1】:

如果您只是想防止随意查看密码,您可能需要考虑将密码编码/解码到base64/从base64。它至少不安全,但密码不会被人类/机器人随便读取。

import base64
# Encode password (must be bytes type)
encoded_pw = base64.b64encode(raw_pw)

# Decode password (must be bytes type)
decoded_pw = base64.b64decode(encoded_pw)

【讨论】:

谢谢!这正是我想要的。 这是一个非常好的答案,您可以在代码中使用最好的超强加密 - 但由于您还必须将解密密钥存储在代码中,您实际上并没有获得任何安全性。但你可能很容易自欺欺人! 这不能防止真正的窥探。但它可以防止未经训练的眼睛瞥一眼代码并说“哦,看那个!”并看到:密码=“abc123sdfsdf” 我喜欢更短的拼写密码 = 'c2VjcmV0'.decode('base64') 不过它会在 Python 3.0 中停止工作。 很多人似乎认为有一些方法可以保护这些密码。据我所知,除了明文或简单转换的文本之外,没有其他方法可以存储访问内部系统的密码。 Base64 是您所能获得的最佳选择。【参考方案2】:

显然,您最好的选择是将其委托给第三方。如果您可以使用其他凭据(例如,您的进程正在运行的用户帐户)对您连接的任何内容进行身份验证,您可以将权限级别留给操作系统层。或者,如果足够重要/可能,您可以提示用户(将密钥存储在(可以说)稍微不易破解的湿件中)

如果您确实需要存储一些密码或密钥,我建议您将其与代码分开存储在您读入的文件中,然后删除-必要时混淆。这样做的好处是:

您可以将文件的文件权限设置得尽可能严格(即只能由运行您的程序的帐户读取),这与您的程序的其余部分可能被更多人读取不同。

您不会不小心将其签入您的版本控制系统!

python 字符串不需要限制为可打印字符(或使用笨拙的转义),因此您可以尽可能使用任意密钥文件,而不是人类可读的密码。如果它不是人工输入的,就没有理由拥有密码的所有弱点。

为了混淆,您可以按照建议使用 base64,或者一些自制方案,如 XORing 或使用存储在其他地方的另一个密钥进行解密,需要查看两个位置。请注意,除了机会性的肩部冲浪(如果有的话)之外,这并不能防止任何事情 - 确保也有一定程度的真正安全性(包括明显的安全性,例如对机器的物理访问!)

【讨论】:

【参考方案3】:

您首先应避免以明文形式存储密码。这是唯一“真正”的解决方案。

现在,您可以使用哈希模块(python 2.5 及以下的 md5 和类似模块)轻松加密密码。

import hashlib
mypass = "yo"
a = hashlib.sha256(mypass).digest()

【讨论】:

一个很酷的解决方案,但密码是明文,因为它必须以这种方式读入方法。我需要一种以杂乱无章的方式存储密码的方法,这种方式对没有工作的人来说毫无意义,但让 python 确切地知道我在说什么。 我建议吃盐。众所周知,很多 用户使用相同的密码。为了保护具有数据库访问权限的人不进行任何关联,您应该使用 salt = ''.join(random.choice(string.ascii_letters) for _ in range(1,5)) hashed_pa​​ssword = 'sha256:%s:% s' % (salt, hmac.new(salt, password, hashlib.sha256).hexdigest()) 哈希是一种方式。一旦它被散列,我就无法解密它。我需要向方法发送明文。 我怀疑发帖者需要使用密码才能访问其他服务。 @caedis:必须在方法中输入明确的密码不是好的设计。对其进行编码很可能不会对软件的(较差的)安全性产生太大影响 - 因为您应该永远能够以文本形式检索密码。【参考方案4】:

许多密码接受协议和工具都有指定密钥文件而不是密码的方法。该策略可能在这里奏效;与其对密码进行硬编码,不如对文件名进行硬编码(或者更好的是,将其设为参数!)。您甚至可以使用 SSH 并拒绝加载不属于 (1) 当前用户 (2) 只能由该用户读取的密钥文件。

【讨论】:

在这种情况下我不能使用密钥文件。【参考方案5】:

这在很大程度上取决于您保留密码的原因,以及您认为哪里存在安全问题。

如果您将来将此密码存储或匹配到数据库:

这应该不是问题,但如果您担心,请尽早使用数据库的密码加密并将其存储 (SELECT PASSWORD('mySamplePassword'); ),然后在以后的查询中直接比较加密版本。

如果您将其保存以供以后传输:

你真的无能为力。传输本身很可能比您处理密码更容易嗅探。

如果不知道你在做什么的更多细节,这有点难以回答。

【讨论】:

【参考方案6】:

base64 答案非常适合混淆密码,并且无需用户干预即可工作,但代价是不安全。如果用户可以登录并访问系统密钥环服务,请查看keyring 包。我用它在 OS X 和 Linux 系统上存储密码。

【讨论】:

以上是关于在 Python 中混淆字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 python 脚本中隐藏密码(仅限不安全的混淆)

混淆二进制字符串中的位数(Python)

Python / Django 中的 Unicode 与 UTF-8 混淆?

Python长度的unicode字符串混淆

Python爬虫eval混淆,爬虫进阶实战系列

Python爬虫eval混淆,爬虫进阶实战系列