【问题标题】:How Spring encodePassword with saltSpring如何用盐编码密码
【发布时间】:2013-02-28 08:35:30
【问题描述】:

我介绍了 Web 应用程序的 Spring 安全性。首先,我的身份验证管理器如下。

<authentication-manager>
    <authentication-provider>
        <password-encoder hash='md5'>
        </password-encoder> 
        <jdbc-user-service data-source-ref="dataSource"/>
    </authentication-provider>
</authentication-manager>

为了进行测试,我将使用“1”作为用户名和密码。我使用在线 md5 哈希生成器,我得到了 md5(1) 的“c4ca4238a0b923820dcc509a6f75849b”。使用此配置登录可以正常工作。我想尝试盐,我修改身份验证管理器如下。

<authentication-manager>
    <authentication-provider>
        <password-encoder hash='md5'>
            <salt-source user-property="username"/>
        </password-encoder> 
        <jdbc-user-service data-source-ref="dataSource"/>
    </authentication-provider>
</authentication-manager>

因此,正如我在网上看到的那样,盐的使用方式就像哈希(盐 + 密码)。所以使用相同的工具我散列'11'然后得到散列值'6512bd43d9caa6e02c990b0a82652dca'。我用该值更新数据库。但是现在登录失败并抛出错误“原因:凭据错误”。这意味着密码与数据库不匹配。所以我的问题是,这是否意味着 Spring 使用不同的腌制方式?

【问题讨论】:

  • 使用BCrypt。它更安全,并且盐渍会自行处理。 MD5 并不是散列密码的好选择。
  • 应该试试。谢谢卢克

标签: spring spring-security md5 salt


【解决方案1】:

由于使用的是spring security,可以考虑使用PasswordEncoderbean。

<beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
</beans:bean>

您的身份验证管理器将类似于(更改代码):

<authentication-manager>
    <authentication-provider>
        <password-encoder ref="passwordEncoder">
            <salt-source user-property="username"/>
        <password-encoder/>
        <jdbc-user-service data-source-ref="dataSource"/>
    </authentication-provider>
 </authentication-manager>

访问Spring Security Custom Authentication and Password EncodingSpring Security:password encoding in DB and in applicationContext了解更多信息。

【讨论】:

  • 使用属性“hash”是不是也一样?我认为这与显式创建 bean 相同。将 org.springframework.security.authentication.encoding.ShaPasswordEncoder 作为 PasswordEncoder 很容易按照以下方式进行注入?
【解决方案2】:

该死的反正春天的腌制方法是不同的。用户按照 Java 代码使用盐计算哈希。

public static void main(String[] args) {
    Md5PasswordEncoder md5 = new Md5PasswordEncoder();
    String hash = md5.encodePassword("1", "1");
    System.out.println(hash);
}

我得到了“6a8a1f634e38d30e87b450899b31f810”作为加密密码(不同的权利??)。然后我将它插入数据库并尝试我的应用程序登录。沃拉!!!登录成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2015-02-10
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多