使用Java中的PBKDF2进行密码验证

时间:2010-03-03 22:35:45

标签: java cryptography passwords aes

我在Java中使用基于密码的文件加密;我使用AES作为底层加密算法,PBKDF2WithHmacSHA1使用以下代码从盐和密码组合中导出密钥(我从本网站的另一张慷慨的海报中获得)。

SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec ks = new PBEKeySpec(password,salt,1024,128);
SecretKey s = f.generateSecret(ks);
Key k = new SecretKeySpec(s.getEncoded(),"AES");

我分享盐,用户在每端输入密码,加密和解密工作正常:-)我的问题是我希望能够在开始之前验证用户输入的密码是否正确(可能很长的)解密过程。我知道PBKD规范包含一个可选的2字节验证值,但我不知道如何使用上述方法生成此值。 Java是否为此提供支持,或者不支持哪种安全替代方案?

感谢您的时间。

3 个答案:

答案 0 :(得分:5)

根据定义,没有“快速检查”机制是安全的。使用PBKDF2或相关技术的重点是使密码检查变慢,以防止密码破解程序。如果您添加了快速检查系统,密码破解程序将能够非常快速地猜测密码。

答案 1 :(得分:4)

嘿,感谢疯狂的苏格兰人和克里斯的帮助。在做了一些挖掘后,我决定使用Dr Gladmans file encryption page中描述的方法进行密码验证和消息验证。我相信这种方法,基于PBKDF2和MAC,使得密码的验证值足够昂贵,以使其安全。再次感谢,我希望这个解决方案可以帮助其他人。

答案 2 :(得分:2)

计算某种密码验证标记并将其与加密文件数据一起存储,以便您可以先检查它。这可能类似于固定(短)字符串的PBMAC。当然,这需要是一个不可逆的功能,所以一个破解者无法确定密码,也不会太快计算,以免混淆暴力攻击。

您是否考虑过(以及如何)检测整个文件是否已正确解密?您可能应该研究PBES2和PBMAC的某种组合,而不是直接使用AES。