- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在从事一个 Java 项目,我必须确保保存在纯文本文件中的用户密码的 secret 性和完整性。
为此,我将只在文件中写入密码的哈希值。更具体地说,我的意图是编写密码的哈希值和随机盐,加上随机盐本身,以避免使用彩虹表和查找表。我还想将 key 扩展与 PBKDF2 一起使用,以使散列的计算在计算上变得昂贵。最后,我想使用键控哈希算法 HMAC 作为最后一层保护。
我正在尝试在 Java 代码中实现我的想法,并且我找到了上面介绍的操作的一些示例:
private static byte[] pbkdf2(char[] password, byte[] salt, int iterations, int bytes)
throws NoSuchAlgorithmException, InvalidKeySpecException
{
PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, bytes * 8);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
return skf.generateSecret(spec).getEncoded();
}
我真正无法理解的是如何输入我的 key 作为 HMAC 算法使用的 key ,因为它似乎不是函数的输入。我已查看 Java 文档,但找不到解决我的问题的方法。
在这一点上,我不确定我是否正确理解了加密机制的不同部分是如何工作的,所以我愿意接受有关该主题的任何帮助。
最佳答案
我想我看到了困惑。您显然希望您的代码应用 PBKDF2,然后应用 HMAC-SHA-1。它不是这样工作的:HMAC-SHA-1 在 PBKDF2 中使用。
要点PBKDF2是重复应用具有以下属性的函数:
HMAC-SHA-1 就是这样一个函数,也是一个常见的选择。 PBKDF2 还有其他变体,使用 HMAC-MD5、HMAC-SHA-256 或其他函数(但这些变体不在基本 Java 库中)。
PBKDF2 接受两个数据输入(加上一些配置输入):密码和盐。如果你想在计算中包含一个 secret 值,PBKDF2 的输入就是它的地方:不要在此之上添加自定义方案(做你自己的加密是错误的秘诀)。附加 pepper (所有帐户共有的 secret 值)加盐(帐户之间不同的公共(public)值)。
请注意 pepper is of limited usefulness .它仅在散列和胡椒 secret 值存储在不同位置时才有用——例如,如果散列在数据库中而胡椒在磁盘文件中,该磁盘文件不会直接受到 SQL 注入(inject)攻击。
关于passwords - Java 中带有 HMAC 的 PBKDF2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20047418/
我在 C# 中有以下代码 PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes,
是否有任何 python PBKDF (pkcs12) 实现?请注意,我不是在寻找 PBKDF1 或 PBKDF2 (pkcs5) 实现,而是在寻找 pkcs12 实现。正如本 question 中所
我是一名优秀的程序员,十分优秀!