Spring security Spring Security 3+;随机盐

Spring security Spring Security 3+;随机盐,spring-security,salt,password-encryption,Spring Security,Salt,Password Encryption,因此,我知道您可以基于userDetail属性在Spring Security中使用salt检查密码,然后将其散列以与数据库中的散列进行比较,但是如果创建每个用户时使用的salt是随机的(并且存储在DB中),该怎么办,我是否需要创建自己的userDetails类,该类包含一个salt属性,然后将其设置为spring security在securityApplicationContext中用于salt的字段 如果是这样,我将如何编写自己的userDetails类来实现这一点?很抱歉,Spring/

因此,我知道您可以基于userDetail属性在Spring Security中使用salt检查密码,然后将其散列以与数据库中的散列进行比较,但是如果创建每个用户时使用的salt是随机的(并且存储在DB中),该怎么办,我是否需要创建自己的userDetails类,该类包含一个salt属性,然后将其设置为spring security在securityApplicationContext中用于salt的字段

如果是这样,我将如何编写自己的userDetails类来实现这一点?很抱歉,Spring/Java还是个新手


好的,那么我如何告诉securityApplicationContext使用myCustomUserDetails类来存储用户,而不是默认的userDetails类呢

像这样:

<b:bean id="customUserDetailsService" class="com.your.company.security.MyUserDetailsService"/>

<s:authentication-provider user-service-ref="customUserDetailsService" />

这是在您的安全上下文中进行的

这也可能有帮助


.

您的问题的答案是
如果盐是随机的,那么您需要将其提供给验证过程。只需像编写任何其他类一样编写
userDetails
类。好吧,那么我如何告诉securityApplicationContext使用myCustomUserDetails类而不是默认的userDetails类来存储用户呢?最好使用像Bcrypt这样的算法,它包含一个随机salt。如果你在网上搜索这里或其他地方,你会发现这种情况。不幸的是,我在密码加密方面受到限制。我需要将我的应用程序与另一个组的应用程序集成,该应用程序使用随机salt+哈希进行加密。是的,正如@Ramhound所说,您需要与每个用户关联的salt值。你还必须实现一个与另一组算法相匹配的
密码编码器。所以为了确保,我实现了我自己的userDetailsService,在'loadByUsername'方法中,我返回了一个userDetails对象,它是我自己的userDetails实现,对吗?是的。准确地说,然后您注入新的
userdetails服务
。好的,我设置了CustomUserDetails服务和CustomUserDetails,但是当我尝试登录时,它说用户名/密码组合不正确。但不知道如何调试它。SpringSecurity如何将输入的密码与DB密码进行比较?我将salt密码的散列作为密码存储在数据库中。这与变量类型有关吗?我以字节[]的形式从数据库中获取salt和hash,在CustomUserDetails中有:password=newstring(myUser.getHash(),“UTF8”);salt=新字符串(myUser.getSalt(),“UTF8”);您可以在
UserDetailsService
之外进行身份验证,您应该这样做。您的应用程序可以自己对用户进行身份验证,不需要spring security来完成。用户详细信息服务的想法是让spring“了解”系统中的用户。因此,一般来说,我会创建一个类似于
LoginService
的服务,并在用户尝试登录时调用它,而不是让
UserDetailsService
知道密码。无论用户是否登录,
UserDetailsService
应该只返回给定用户名的用户。另外,永远不要使用
new String()
这就是为什么: