如何将SHA-512与o.s.s.crypto.password.StandardPasswordEncoder一起使用?

时间:2014-08-18 13:20:50

标签: spring-security sha512

我需要在代码中使用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-512o.s.s.crypto.password.StandardPasswordEncoder一起使用? 为什么没有允许传递外部盐的公共方法?

1 个答案:

答案 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