【发布时间】: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