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

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

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

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

【问题讨论】:

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

标签: python linux encryption passwords obfuscation


【解决方案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 系统上存储密码。

      【讨论】:

        猜你喜欢
        • 2011-03-14
        • 2017-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多