我正在编写一个程序,该程序从用户那里获取密码,然后将一些加密的数据写入文件。到目前为止,我提出的方法如下:

  • 从Hashing FileName和系统时间生成128位IV,然后将其写入文件的开头。
  • 使用SHA256从密码中生成256位键。
  • 使用AES使用CBC模式使用此键加密数据(以32位静态签名开始),然后将其写入文件。

解密时,读取IV,然后用密码以相同的方式生成密钥,并将前32位与签名应与签名相比,以确定键是否有效。

但是我看着 AES示例 提供 polarssl (我用来进行哈希和加密的库),它们使用了更复杂的方法:

  • 从Hashing文件名和文件大小生成128位IV,然后将其写入文件的开头。
  • 从Hashing(SHA256)生成256位钥匙,并将IV一起8192次。
  • 使用此键初始化HMAC。
  • 使用AES在CBC模式下使用此键加密数据,并将其写入文件,同时使用每个加密块更新HMAC。
  • 将HMAC写入文件末尾。

我的印象是第二种方法更安全,但是我没有足够的知识来支持它,除了看起来更复杂。

  • 如果更安全,这样做的原因是什么?
  • 将HMAC附加到文件末尾比在加密数据开头具有签名更安全吗?
  • 散列的8192倍是否增加了安全性?

笔记: 这是一个开源项目,因此无论我使用什么方法,任何人都可以免费使用。

有帮助吗?

解决方案

第二个选项更安全。

您的方法,不提供任何消息完整性。这意味着攻击者可以修改密文的一部分并改变纯文本解密。只要他们不修改任何会改变您的32位静态签名的内容,那么您就会相信它。第二种方法上的HMAC提供了消息完整性。

通过散列密钥8192次,它为某人试图违反密钥而添加了额外的计算步骤。假设用户会选择基于字典的密码。使用您的方法,攻击者必须执行 SHA256(someguess) 然后尝试解密。但是,使用PolarSSL版本,他们必须计算 SHA256(SHA256(SHA256...(SHA256(someguess))) 8192次。这只会减慢攻击者的速度,但这可能已经足够了(目前)。

为了获得价值,请使用现有库。密码学很难,容易出现微妙的错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top