【问题标题】:Can pickle dumps be scrambled?泡菜堆可以炒吗?
【发布时间】:2017-09-01 11:34:48
【问题描述】:

对于自动化项目,我必须保留用户 ID/密码以允许我的脚本连接到远程服务。

我的想法是使用keyring 模块来实现更好的安全级别;但并非所有平台都支持密钥环;我也在考虑将凭据存储到平面文件中。我创建了一个“凭据”类;并认为使用pickle 我可以转储/加载该类的对象,例如:

def _store_to_file(credentials):
    from pickle import dump
    pkl = open('whatever.dat', 'wb')
    dump(credentials, pkl)
    pkl.close()

不幸的是,这个文件以纯文本形式泄露了密码:

S'_password'
p6
S'bla'

我了解由本地脚本存储的文件并不能提供真正的安全性。但我希望至少能达到这样一个点,即需要一个简单的“lesswhatever.dat”来获取密码文本。

我曾希望 pickle 有某种“争夺”模式;但找不到任何东西。我忽略了什么吗?

或者:是否有另一种方法可以轻松地持久化我的对象,但不是那么“易于人类阅读”?

【问题讨论】:

  • 老实说,我会使用bcrypt 创建一个加密和解密函数,然后将base64 编码的加密密码存储到您的pickle 文件中。
  • 所以在腌制之前打乱数据
  • @KeefBaker 除非我弄错了:bcrypt 只允许我散列密码。但稍后我需要 纯文本 中的密码。换句话说:我需要一些能给我 encrypt() 和 decrypt() 功能的东西;像带有 rot13 的编解码器。但可能比 rot13 难 10% ;-)
  • 我的错,我以为我在我的项目中使用了 bcrypt。我实际上在使用from Crypto.Cipher import AES

标签: python pickle


【解决方案1】:

你不应该。

在尝试保存密钥的安全加密副本的应用程序中,问题只是他们需要另一个密钥来解密它。它也可以通过需要另一个密钥来加密。它可以...(抱歉开玩笑:-))。仅当您必须存储多个秘密时才有意义,因为您使用一个密码解锁安全保险库 - 密钥环和密码管理器所做的......

对于单个密码,正确且可移植的方法是依靠操作系统提供安全文件夹。 Linux(和类 Unix)都提供访问控制规则(仅用户可访问)或加密文件夹(如果您需要更好的安全性)。只需记录它并尊重single responsibility principle

【讨论】:

  • 我明白这一切。但这是公司内部工具。当一些入侵者设法扫描我的一位同事的本地磁盘时;我们已经陷入了深深的……麻烦之中。只是为了记录:我们需要与我想与之交谈的服务器交谈的相同密码......也用于与我们的 SVN 服务器交谈。该密码以纯文本形式存在于某个 .svn 文件夹中。
【解决方案2】:

一个简单的解决方案;基于 Keef Baker 的评论——使用 AES 加密来加密密码/用户名;像这样:

class Credentials(object):

  def __init__(self, user, password):
      self._user = aes.encrypt(user)
      self._password = aes.encrypt(password)

  @property
  def user(self):
      return aes.decrypt(self._user)

  @property
  def password(self):
      return aes.decrypt(self._password)

  from Crypto.Cipher import AES
  aes = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')

【讨论】:

  • 赞成,但需要注意的是,在实际代码中您显然不会使用 rot13,但例如hashlib 或者更好的是 cryptography,密钥存储在单独的 secrets.py 模块中(如果需要,可以将其排除在版本控制之外)。
  • 我没有看到 hashlib 给我解密/加密;但密码学确实;-)
  • @ZeroPiraeus 但是基夫给了我另一个很好的提示;所以我至少重新设计了使用 AES 加密。
  • @ZeroPiraeus 我喜欢你的反馈;也可以随意查看stackoverflow.com/questions/43274703/… ;-)
猜你喜欢
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 2019-05-09
  • 2022-10-12
相关资源
最近更新 更多