java - Apache Shiro - 密码格式问题

标签 java jakarta-ee hash shiro

我尝试将PasswordMatcher与DefaultPasswordService和DefaultHashService一起使用。

DefaultHashService hashService = new DefaultHashService();
hashService.setHashIterations(10000); 
hashService.setHashAlgorithmName(Sha512Hash.ALGORITHM_NAME);
hashService.setGeneratePublicSalt(true);

DefaultPasswordService passwordService = new DefaultPasswordService();
passwordService.setHashService(hashService);
String encryptedPassword = passwordService.encryptPassword("password");
System.out.println("Result:"+encryptedPassword);

这是我必须保存到数据库“密码”列中的结果。

$shiro1$SHA-512$10000$T5nkQEA3qjMLPuB/x+WN4Q==$qWViYjBljsMwH7FSvhecKlxQqXY11lv8eS4guxD9t8D4HTeKclN/muyTnhzYZ+YvI1YkEg6L7T2kM3qykUG0XQ==

一切正常。然而我的问题是为什么迭代次数和算法名称与盐和密码一起保存?在这种情况下,我们确实会通知潜在的攻击者,他们会转储我们的数据库有关此类重要属性的信息。

最佳答案

如今,我们的目标是保护用户密码,即使攻击者知道所有实现 secret 。这称为“white-box encryption ”:

In such a context, a ‘white-box attacker’ has full access to the software implementation of a cryptographic algorithm: the binary is completely visible and alterable by the attacker; and the attacker has full control over the execution platform (CPU calls, memory registers, etc.). Hence, the implementation itself is the sole line of defence.

话虽这么说,您可以将哈希算法和迭代计数与密码一起存储,因为您必须假设攻击者无论如何也有权访问代码/二进制文件(如果他们有权访问数据库,则这不太可能) .

将迭代次数与哈希值一起存储还有一个额外的好处:将来您可能希望更改为更大的迭代次数,因为处理能力有所提高。然后,您可以通过使用旧迭代次数检查所有哈希,应用多次额外迭代并将新结果存储在数据库中,升级到更安全的方案,轻松升级数据库。

同样,如果您将哈希算法添加到哈希中,您以后可以轻松更改为其他密码方案(bcrypt,...),并在用户下次登录时优雅地升级用户。

关于java - Apache Shiro - 密码格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26821993/

相关文章:

java - 启动画面后加载 SecondActivity 时出错

java - OpenOffice xSentenceCursor 卡在段落末尾

java - Android - 以编程方式打开微调器(对话框微调器)

jakarta-ee - 使用 Facelets、Seam 和 Logback 根据日志级别有条件地在错误页面上打印堆栈跟踪

java - 我的容器如何注入(inject)未标记为@stateful/@stateless等的bean?

perl - 当我打印 Perl 哈希时,是什么决定了键的顺序?

java - 使用自定义注释调用方法 - JAVA

Maven资源过滤

python - 如何从 Perl 哈希在 Python 中创建等效的字典?

c++ - 如何哈希一个三态二维数组?