【问题标题】:Encrypting a file with a weak password, bcrypt or SHA-256 + AES-256?使用弱密码 bcrypt 或 SHA-256 + AES-256 加密文件?
【发布时间】:2011-06-03 15:28:46
【问题描述】:

我从一个弱密码(ex 为 8 个小写字符)和一个文件开始。我需要使用该密码加密该文件。结果必须能够抵御已知的攻击。

方法 1:我可以使用 SHA-256 对密码进行哈希处理,然后使用生成的哈希和文件作为 AES-256 的输入,从而得到一个加密文件。我知道 SHA-256 和 AES-256 都非常快。这不会使文件容易受到暴力攻击吗?

例如,是否可以获取预先计算的 SHA-256 哈希值的彩虹表,并假设它是一个非常小的文件和一个非常弱的密码,尝试在合理的时间内使用该表中的每个哈希值进行 AES-256 解密(使用专用硬件几个月)。

方法 2:使用 bcrypt。如果我理解正确,bcrypt 比 SHA-256 + AES-256 更适合加密文件,因为它的密钥生成方案有一个工作因素,可以产生更强的密钥。还是我错了?

我看到的 Ruby 和 Python 实现(包装器?)专注于使用 bcrypt 作为密码的散列方案,而不是密码本身。我什至可以使用 bcrypt 散列弱通行证并“一步”加密文件吗?

方法 3:使用 bcrypt 对 pass 进行散列,使用该散列和文件作为 AES-256 的输入,给我加密文件。这解决了“生成密钥太快”的问题。 (假设它是一个问题。)但是,bcrypt 哈希是 448 位长,而 AES-256 需要一个 256 位的密钥。天真的解决方案是简单地删除散列的尾随位并将其用作 AES-256 的密钥。我不会走这条路,因为我对密码学知之甚少,不知道后果是什么。

编辑:我不能加盐,因为这是离线应用程序。 IE。没有合理的地方来存储盐。我可以对通行证进行加盐并将未加密的盐与加密文件一起存储。如果说数据库遭到破坏,盐几乎本质上是公开/可见的。盐的目的是防止彩虹表攻击。感谢 Nemo,下面。

【问题讨论】:

  • 所有这些听起来都是个坏主意。如果您从一个弱密码开始,您应用的任何转换仍然会产生一个弱密码,因为它们可能会被知道或依赖于默默无闻。
  • 我想问题是当用户不顾所有建议决定使用弱密码时,我们能提供的最多是什么。我不想要求带有符号和大写字母的密码,因为人们通常会忘记它们。
  • 把决定权留给用户怎么样,而不是强迫他们使用较弱的密码?
  • 我在哪里说过我打算强制用户使用较弱的密码?相反,我正在寻找一个即使密码很弱也相当强大的方案。

标签: encryption cryptography aes sha bcrypt


【解决方案1】:

方法 4:使用PKCS#5(PBKDF2 用于从 pass 中派生密钥 + 您选择的密码用于使用该密钥进行加密),最好是其他人的实现。

别忘了盐。 (你把它和加密数据一起存储。它只需要8个字节左右。)

【讨论】:

  • 我认为已知的盐根本就不是盐。
  • 你想错了:-)。根据定义,盐几乎是公开的。请参阅here 了解更多信息。
  • 你是对的。这与几个月前我在研究密码散列方案时得出的结论相同,但现在,我继续说我上面所说的。 [拍前额] 一个迹象表明我的大脑正在变成糊状。 =) 谢谢!
  • 因为它是使用广泛使用的加密原语的广泛使用的标准。例如,SHA-256 比 Blowfish 获得了更多的分析,这使得它在大多数人看来“更安全”。但据我所知,两者都没有被破解。 (使用标准还可以提高可维护性;如果有人担心的话,将来人们会更容易找到其他平台的实现。)
  • 我已经阅读了 PKCS#5 文档,我认为这正是我想要的。据我了解,为了符合标准,可以使用 PBKDF2 生成一个 256 位密钥,然后将该密钥与 AES-256 一起使用。 PBKDF2 本身可以使用多种伪随机函数,例如 HMAC-SHA-1。在 python 中,可以使用这个模块:dlitz.net/software/python-pbkdf2 与 PyCrypto 的作者相同。从源码看,HMAC-SHA1 用于伪随机函数。
猜你喜欢
  • 2011-09-03
  • 2017-02-13
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多