Spring security 如何将SHA-512与o.s.s.crypto.password.StandardPasswordEncoder一起使用?
我需要在我的代码中使用Spring security 如何将SHA-512与o.s.s.crypto.password.StandardPasswordEncoder一起使用?,spring-security,sha512,Spring Security,Sha512,我需要在我的代码中使用SHA-512来散列密码 现在我使用o.s.s.authentication.encoding.PasswordEncoder,同时将其初始化为ShaPasswordEncoder(512) 此外,o.s.s.authentication.encoding.PasswordEncoder支持该方法 String encodePassword(String rawPass,Object salt)允许将盐与密码分开存储 不幸的是,o.s.s.authentication.en
SHA-512
来散列密码
现在我使用o.s.s.authentication.encoding.PasswordEncoder
,同时将其初始化为ShaPasswordEncoder(512)
此外,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一起使用?
为什么没有公开的方法可以让盐从外部储存?我必须承认,这不是春季安全中最连贯的部分
DaoAuthenticationProvider.getPasswordEncoder()
返回一个o.s.authentication.encoding.PasswordEncoder
,根据javadoc,它已被弃用
诀窍是DaoAuthenticationProvider.getPasswordEncoder()
将一个对象作为参数,这个对象可能是一个o.s.authentication.encoding.PasswordEncoder
。。。但不要试图做一个得到
据我了解,o.s.s.crypto.password.StandardPasswordEncoder
就是一个中等安全性和固定SHA-256的例子。如果您想要更高级别的安全性,可以使用o.s.s.crypto.password.BCryptPasswordEncoder
,它使用具有可配置级别的健壮BCrypt算法。查看源代码后,我可以确认是否使用salt并将其存储在内部的编码密码中
也许Spring安全团队的某个人可以解释这些(可讨论的)选择的原因,即无法更改摘要算法,但我不能;也许这仅仅是因为对于使用SHA来说,坚持使用(不是不推荐的)ShaPasswordEncoder
就足够了。我只是在StandardPasswordEncoder
中提到了这一点:如果您正在开发一个新系统,BCryptPasswordEncoder
在安全性和与其他语言的互操作性方面都是一个更好的选择
因此,要么你听从标准密码编码器
作者的建议,直接使用BCryptPasswordEncoder
,要么你必须自己动手
复制StandardPasswordEncoder
的源代码就足够了,只需坚持org.springframework.security.crypto.password
包,因为存在包私有导入,并将2参数构造函数修改为公共的,如下所示:
public ConfigurablePasswordEncoder(String algorithm, CharSequence secret) { ... }
所有这些与其说是一个干净的解决方案,不如说是一系列的变通方法,但我从来没有找到更好的方法
作为结论,我认为只有接口o.s.s.authentication.encoding.PasswordEncoder
不受欢迎,因为它将salt存储在编码密码之外。因此,它不应用于密码编码器的进一步开发。但是它的实现类并没有被弃用(无论是在上一个3.2版本中,还是在4.0.0M2版本中),如果满足您的要求,您可以安全地继续使用ShaPasswordEncoder