我从一个弱密码(前8个小写字符)和一个文件开始。我需要使用该密码加密该文件。结果必须能够抵御已知的攻击。</ p>
方法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对传递进行散列,使用该散列和文件作为AES-256的输入,为我提供加密文件。这样可以解决“密钥太快而无法生成”的问题。 (假设它有问题。)但是,bcrypt哈希长448位,AES-256需要256位密钥。天真的解决方案是简单地删除散列的尾随位并将其用作AES-256的密钥。我不会走这条路,因为我对密码学知之甚少,不知道后果是什么。
编辑:我无法对传递进行限制,因为这是针对离线应用程序的。即。没有合理的地方来储存盐。我可以将通道加盐,并将未加密的盐与加密文件一起存储。如果说数据库受到损害,盐几乎就是公共的/可见的。盐的目的是防止彩虹表攻击。感谢Nemo,吼叫。
答案 0 :(得分:11)
方法4:使用PKCS#5(PBKDF2从传递中获取密钥+使用该密钥进行加密的密码),最好是其他人的实现。
不要忘记盐。 (您将它与加密数据一起存储。它只需要8个字节左右。)