我需要在代码中使用SHA-512
来散列密码。
现在我将o.s.s.authentication.encoding.PasswordEncoder
初始化为ShaPasswordEncoder(512)
时使用。{/ p>
此外,o.s.s.authentication.encoding.PasswordEncoder
支持方法
String encodePassword(String rawPass, Object salt)
允许与密码分开存储盐。
不幸的是,o.s.s.authentication.encoding.PasswordEncoder
已被弃用。
此外,o.s.s.crypto.password.StandardPasswordEncoder
仅支持SHA-256
。
此外,它是最终类,并且不允许其重载以支持SHA-512
。
如何将SHA-512
与o.s.s.crypto.password.StandardPasswordEncoder
一起使用?
为什么没有允许传递外部盐的公共方法?
答案 0 :(得分:1)
我必须承认它不是Spring Security中最连贯的部分...... DaoAuthenticationProvider.getPasswordEncoder()
返回o.s.s.authentication.encoding.PasswordEncoder
根据javadoc弃用!{/ p>
诀窍是DaoAuthenticationProvider.getPasswordEncoder()
将Object作为参数,此Object可能是o.s.s.authentication.encoding.PasswordEncoder
...但不要尝试获取!
根据我的理解,o.s.s.crypto.password.StandardPasswordEncoder
是一个具有中等安全性和固定SHA-256的示例。如果您想要更高级别的安全性,可以使用o.s.s.crypto.password.BCryptPasswordEncoder
,它使用具有可配置级别的强健BCrypt algorythm。查看源后,我可以确认两者都使用salt并将其内部存储在编码密码中。
也许Spring Security团队的某些人可以解释那些关于不可能改变消化算法的那些(可记录的)选择的原因,但我不能;也许只是因为使用SHA就足以坚持(不推荐)ShaPasswordEncoder
。我只是在StandardPasswordEncoder
中注意到这句话:如果您正在开发一个新系统,BCryptPasswordEncoder
在安全性和与其他语言的互操作性方面是更好的选择。
因此,要么您遵循StandardPasswordEncoder
作者的建议,直接使用BCryptPasswordEncoder
,要么您必须自己动手。
复制StandardPasswordEncoder
的源代码就足以坚持org.springframework.security.crypto.password
包,因为有私有的包导入,并将2参数构造函数修改为公共:
public ConfigurablePasswordEncoder(String algorithm, CharSequence secret) { ... }
所有这些都是一系列变通方法,而不是一个干净的解决方案,但我从来没有找到更好的方法!
作为结论,我想说只有接口 o.s.s.authentication.encoding.PasswordEncoder
被弃用,因为它将盐存储在编码密码之外。所以它不应该用于进一步开发密码编码器。但是它的实现类并未被弃用(在最后的3.2发行版本和4.0.0M2中都没有),如果符合您的要求,您可以安全地继续使用ShaPasswordEncoder
。