我在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是否为此提供支持,或者不支持哪种安全替代方案?
感谢您的时间。
答案 0 :(得分:5)
根据定义,没有“快速检查”机制是安全的。使用PBKDF2或相关技术的重点是使密码检查变慢,以防止密码破解程序。如果您添加了快速检查系统,密码破解程序将能够非常快速地猜测密码。
答案 1 :(得分:4)
答案 2 :(得分:2)
计算某种密码验证标记并将其与加密文件数据一起存储,以便您可以先检查它。这可能类似于固定(短)字符串的PBMAC。当然,这需要是一个不可逆的功能,所以一个破解者无法确定密码,也不会太快计算,以免混淆暴力攻击。
您是否考虑过(以及如何)检测整个文件是否已正确解密?您可能应该研究PBES2和PBMAC的某种组合,而不是直接使用AES。