Spring Security 3.1有一种非常方便的方法可以在XML配置中包含所需的哈希,它就像一个魅力:
<bean id="securityDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/myDataSource"/>
<property name="resourceRef" value="true"/>
</bean>
<bean id="encoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder" />
<security:authentication-manager>
<security:authentication-provider>
<security:password-encoder ref="encoder" />
<security:jdbc-user-service
data-source-ref="securityDataSource"
authorities-by-username-query="SELECT username, authority FROM user_roles WHERE username = ?"
users-by-username-query="SELECT username, password, enabled FROM users WHERE username = ?"
/>
</security:authentication-provider>
</security:authentication-manager>
我看了一下这个StandardPasswordEncoder类,它有两个适用的公共方法:encode()和matches()。 matches()方法可能被spring用来比较输入密码的散列版本和数据库中的散列密码。 encode()方法似乎用于生成要存储在数据库中的散列字符串。我假设您可以使用它来随意生成或更改密码。
我的问题是:如果有一个完全正当的理由,那么用双向加密方法替换这个哈希会有多困难(或者根本不可能)?我不想牺牲这种弹簧安全配置提供的所有功能和便利,但是(根据业务用户)有必要随意访问纯文本密码。
答案 0 :(得分:2)
只要您提供PasswordEncoder
接口的实现,Spring Security就会很高兴。它不关心密码是否经过哈希加密或可逆加密。
您当然需要授予您对密钥的实施访问权限以验证密码。这将是一个额外的配置头痛和安全风险。另一种方法是使用非对称密钥对其进行加密,但也使用here所述的散列。
所以不,这并不困难。这是否是一个好主意是另一回事。我很想知道业务需求是什么。