我正在编写一个简单的文件加密程序。主要是作为学术练习,但可能用于未来的严肃使用。所有繁重的工作都是通过第三方库完成的,但是以非安全的方式将这些部分放在一起对于非密码学家来说仍然是一个挑战。基本上,我几乎所有事情都按照我认为的方式运作。
我使用128位AES进行加密,密钥长度为128位。我希望用户能够输入可变长度密码,因此我决定使用MD5散列密码,然后使用散列作为密钥。我认为这是可以接受的 - 关键一直是秘密,所以没有理由担心碰撞攻击。
现在我已经实现了这个,我遇到了几篇文章,表明这是一个坏主意。我的问题是:为什么?如果选择了一个好的密码,那么密码本身应该足够强大,除非通过特殊的(读取:当前不可行的)蛮力努力,否则永远不会泄露密钥,对吧?我应该使用类似PBKDF2之类的东西来生成密钥,还是除了最极端的加密应用程序之外的所有内容都是过度的?
答案 0 :(得分:4)
Key strengthening上的这篇文章可能会对您有所帮助。基本上你想要使密钥更强(密码比密码更多),并使密码的推导可靠耗时。
答案 1 :(得分:1)
嗯,因为你的帖子很通用,让我说几句一般事情:
MD5,SHA-0,SHA-1都是破碎的哈希值,您不应将它们用于任何加密目的,请使用SHA-2。
一般来说,您应该使用众所周知的文档化方法从密码中删除密钥(您没有提及使用哪种语言,请说明您正在使用哪种语言)。
在进行任何类型的安全编程时,最重要的事情是,在您做任何事情之前,严格记录您的“威胁模型”。这基本上是您要阻止的所有攻击的列表,以及您将如何执行攻击,以及您无法阻止的攻击类型。这很有趣,你可以了解所有攻击和其他有趣的事情。
答案 2 :(得分:0)
你的新问题的答案是:你绝对应该使用像PBKDF2这样的东西来生成密钥。
我假设您将获得一个密码(至少10个字符,较低的数字和标点符号正确?),然后生成一个AES-256密钥。密钥将用于加密/解密文件。你想使用像PBKDF2这样的东西,以减少让你的文件通过暴力攻击找出你的密钥/密码的人的能力。使用类似PBKDF2(以及随机盐!)会增加破坏文件加密的成本。
我真正推荐的是你用它作为玩具而不来保护你真正关心的东西。如果您不是安全专家,那么您将犯错误,即使是专家(以及他们中的许多人)也会犯错误:http://www.sslshopper.com/article-ssl-and-tls-renegotiation-vulnerability-discovered.html