使用Spring Security 3.1进行双向加密

时间:2012-02-09 22:40:54

标签: spring encryption hash passwords spring-security

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()方法似乎用于生成要存储在数据库中的散列字符串。我假设您可以使用它来随意生成或更改密码。

我的问题是:如果有一个完全正当的理由,那么用双向加密方法替换这个哈希会有多困难(或者根本不可能)?我不想牺牲这种弹簧安全配置提供的所有功能和便利,但是(根据业务用户)有必要随意访问纯文本密码。

1 个答案:

答案 0 :(得分:2)

只要您提供PasswordEncoder接口的实现,Spring Security就会很高兴。它不关心密码是否经过哈希加密或可逆加密。

您当然需要授予您对密钥的实施访问权限以验证密码。这将是一个额外的配置头痛和安全风险。另一种方法是使用非对称密钥对其进行加密,但也使用here所述的散列。

所以不,这并不困难。这是否是一个好主意是另一回事。我很想知道业务需求是什么。