使用 MD5 从密码生成加密密钥?
Posted
技术标签:
【中文标题】使用 MD5 从密码生成加密密钥?【英文标题】:Using MD5 to generate an encryption key from password? 【发布时间】:2010-12-02 20:56:39 【问题描述】:我正在编写一个简单的文件加密程序。主要作为学术练习,但可能供将来认真使用。所有繁重的工作都由第三方库完成,但以安全的方式将各个部分组合在一起对于非密码学家来说仍然是一个相当大的挑战。基本上,我已经按照我认为应该的方式完成了所有工作。
我使用 128 位 AES 进行加密,密钥长度为 128 位。我希望用户能够输入可变长度的密码,所以我决定用 MD5 对密码进行哈希处理,然后使用哈希作为密钥。我认为这是可以接受的——密钥总是应该是秘密的,所以没有理由担心碰撞攻击。
现在我已经实现了这个,我看到几篇文章表明这是一个坏主意。我的问题是:为什么?如果选择了一个好的密码,密码本身应该足够强大,除非通过非凡的(阅读:目前不可行的)蛮力努力,否则永远不会泄露密钥,对吧?我应该使用 PBKDF2 之类的东西来生成密钥,还是对于除了最极端的加密应用程序之外的所有应用程序来说都是过大的杀伤力?
【问题讨论】:
【参考方案1】:Key strengthening 上的这篇文章可能会对您有所帮助。基本上,您希望使密钥更强大(比密码中的熵更多)并使其从密码中可靠地推导出来非常耗时。
【讨论】:
谢谢,这正是我想要的。【参考方案2】:好吧,既然你的帖子很笼统,让我陈述一些笼统的事情:
MD5、SHA-0、SHA-1 都是损坏的哈希值,您不应将它们用于任何加密目的,请使用 SHA-2。
一般来说,您应该使用众所周知且记录在案的方法从密码中获取密钥(您没有提及哪种语言,请说明您使用的是哪种语言)。
在进行任何类型的安全编程时,最重要的是,在您做任何事情之前,严格记录您的“威胁模型”。这基本上是您试图阻止的所有攻击的列表,以及您将如何做到这一点,以及您无法阻止的攻击类型。这样做很有趣,您将了解所有攻击和其他有趣的事情。
【讨论】:
1. MD5 中的漏洞对我的目的无关紧要,因为我只是使用它从可变长度字符串中派生出一个密钥。如果对手得到了哈希,那么游戏无论如何都结束了,因为这一直都是秘密。据我所知,碰撞攻击甚至没有进入这里的竞争环境。 2.这就是我通过问上面的问题想要做的。 :) 编程语言无关紧要,因为这是一个理论问题,而不是实现问题。但如果你只是好奇,我正在使用 Python。 3.这也是我在这里想要做的。 :) 查尔斯,丝滑是对的。不要使用他提到的任何哈希值。如果您要问自己的问题,那么您不了解受损散列函数的含义(我也没有声称我这样做)。去阅读daemonology.net/blog/… 说“永远不要在任何加密设置中使用 MD5”显然是错误的。 (例如,HMAC-MD5 迄今为止没有表现出任何缺陷。)这意味着有人只接受了关于 MD5 易于散列的规则。【参考方案3】:您的新问题的答案是:您绝对应该使用 PBKDF2 之类的东西来生成密钥。
我假设您将拥有一个密码(至少 10 个字符的上下数字和标点符号对吗?),然后将生成一个 AES-256 密钥。密钥将用于加密/解密文件。您想使用 PBKDF2 之类的东西来降低获取您文件的人通过暴力攻击找出您的密钥/密码的能力。使用 PBKDF2(和随机盐!)之类的东西会增加破解文件加密的成本。
我真正建议您将其用作玩具,而不是来保护您真正关心的东西。如果你不是安全专家,你就会犯错误,即使是专家(和很多人一起)也会犯错误:http://www.sslshopper.com/article-ssl-and-tls-renegotiation-vulnerability-discovered.html
【讨论】:
感谢您的提示。在我提出这个问题并最终实施 PBKDF2 之后,我做了更多的研究。大多数繁重的工作是由比我聪明得多的人编写的库完成的。除此之外,我需要从某个地方开始,还有什么比让它保护(希望)我自己的数据更好的方法来确保我的程序是正确的?我很清楚在这里推出我自己的解决方案并完全接受它们的风险。如果我完成了这个项目,我希望将它作为开源软件发布,以便其他人可以审查代码、添加修复程序,并可能公开羞辱我的工作。 :)以上是关于使用 MD5 从密码生成加密密钥?的主要内容,如果未能解决你的问题,请参考以下文章