我正在编写一个简单的文件加密程序。主要作为学术练习,但也可能供将来认真使用。所有繁重的工作都是由第三方库完成的,但以安全的方式将各个部分组合在一起对于非密码学家来说仍然是一个相当大的挑战。基本上,我已经让一切都按照我认为应该的方式工作了。

我使用 128 位 AES 进行加密,密钥长度为 128 位。我希望用户能够输入可变长度的密码,因此我决定使用 MD5 对密码进行哈希处理,然后使用哈希值作为密钥。我认为这是可以接受的——密钥总是应该是秘密的,所以没有理由担心碰撞攻击。

现在我已经实现了这个,我遇到了几篇文章表明这​​是一个坏主意。我的问题是:为什么?如果选择了一个好的密码,密码本身就应该足够强大,除非通过特殊的方式,否则永远不会泄露密钥(阅读:目前不可行)蛮力努力,对吧?我应该使用 PBKDF2 之类的东西来生成密钥,还是这对于除了最极端的加密应用程序之外的所有应用程序来说都太过分了?

有帮助吗?

解决方案

此文章重点加强可以帮助你。基本上你想使键强(比在密码以上熵),并从所述密码导出其可靠地消耗时间。

其他提示

好吧,由于您的帖子很笼统,让我陈述一些一般性的事情:

  1. MD5、SHA-0、SHA-1 都是损坏的哈希值,您不应该将它们用于任何加密目的,请使用 SHA-2。

  2. 一般来说,您应该使用众所周知且有记录的方法从密码中获取密钥(您没有提及哪种语言,请说明您正在使用哪种语言)。

  3. 在进行任何类型的安全编程时,最重要的是,在做任何事情之前,严格记录您的“威胁模型”。这基本上是您试图阻止的所有攻击的列表,以及您将如何阻止的攻击,以及您无法阻止的攻击类型。这样做非常有趣,您将了解所有攻击和其他有趣的事情。

您的新问题的答案是:您绝对应该使用 PBKDF2 之类的东西来生成密钥。

我假设您将拥有一个密码(至少 10 个字符、上下数字和标点符号,对吧?),然后它将生成 AES-256 密钥。该密钥将用于加密/解密文件。您希望使用 PBKDF2 之类的工具来降低获取您文件的人通过暴力攻击找出您的密钥/密码的能力。使用 PBKDF2(和随机盐!)之类的东西会增加破坏文件加密的成本。

我什么 真的 建议您将其用作玩具并且 不是 保护你真正关心的东西。如果您不是安全专家,您就会犯错误,甚至专家(以及很多专家)也会犯错误: http://www.sslshopper.com/article-ssl-and-tls-renegotiation-vulnerability-discovered.html

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