哪种加密方法更安全?为什么?

时间:2013-11-07 20:37:06

标签: security encryption hash hmac

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

  • 通过散列文件名和系统时间生成128位IV,并将其写入文件的开头。
  • 使用SHA256从密码短语生成256位密钥。
  • 使用此密钥在CBC模式下使用AES加密数据(以32位静态签名开头),并将其写入文件。

解密时,读取IV,然后使用密码以相同方式生成密钥,并将前32位与签名进行比较,以判断密钥是否有效。< / p>

但是我在查看AES example中提供的PolarSSL(我用来进行散列和加密的库),他们使用了更为复杂的方法:

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

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

  • 如果它更安全,原因是什么?
  • 将HMAC附加到文件的末尾比在加密数据的开头添加签名更安全吗?
  • 散列8192次会增加安全性吗?

注意:这是一个开源项目,所以无论我使用哪种方法,任何人都可以免费使用它。

1 个答案:

答案 0 :(得分:3)

第二种选择更安全。

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

通过对密钥进行哈希处理8192次,它增加了额外的计算步骤,供某人尝试并强制使用密钥。假设用户将选择基于字典的密码。使用您的方法,攻击者必须执行SHA256(someguess)然后尝试解密。但是,使用PolarSSL版本时,他们必须计算SHA256(SHA256(SHA256...(SHA256(someguess))) 8192次。这只会减慢攻击者的速度,但这可能就足够了(现在)。

为了它的价值,请使用现有的库。密码学很难并且容易出现细微的错误。