使用Java中的PBKDF2进行密码validation

我正在用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"); 

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

谢谢你的时间。

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

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

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

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