2

美好的一天开发者。我有问题。在我的 Web 应用程序中,我使用 Spring Security。我有 2 个简单的角色:用户、管理员。对于这些规则中的每一个,我都有自己的密码,因为它们对我的网络应用程序的访问权限不同。所以我现在以 sha-256 哈希编码将所有密码存储在 security.xml 中:

    <security:http pattern="/search" security="none" />

    <security:http auto-config="true" >

    <security:session-management session-fixation-protection="migrateSession"/>

    <security:intercept-url pattern="/input" access="ROLE_ADMIN, ROLE_USER"/>
    <security:intercept-url pattern="/delete" access="ROLE_ADMIN"/> 

    <security:form-login login-page="/login" 
                         authentication-failure-url="/loginfail"
                         default-target-url="/input" 
                         always-use-default-target="true" 
                         username-parameter="j_username"
                         password-parameter="j_password" />

    <security:logout logout-success-url="/logout"/>

        <security:session-management>
            <security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
        </security:session-management>

    </security:http>


    <security:authentication-manager>
    <security:authentication-provider>
    <security:password-encoder hash="sha-256"/>
    <security:user-service>
    <security:user name="user" password="04f8996da763b7a969b1028ee3007569eaf3a635486ddab211d512c85b9df8fb" authorities="ROLE_USER"/>
    <security:user name="admin" password="8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918" authorities="ROLE_ADMIN"/>
    </security:user-service>
    </security:authentication-provider>
    </security:authentication-manager>

这真的是个好主意吗?也许需要将它们仅存储在 DB(例如 H2)中以获得更多保护。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- Using and configuring C3P0 proxy -->
        <property name="driverClass"><value>org.h2.Driver</value></property>
        <property name="jdbcUrl"><value>jdbc:h2:/home/vadim/workspace-sts-3.1.0.RELEASE/h2/EDUCATION</value></property>
        <property name="user"><value>sa</value></property>
        <property name="password" ><value></value></property>
        <property name="initialPoolSize"><value>3</value></property> <!-- Number of Connections a pool will try to acquire upon startup -->
        <property name="minPoolSize"><value>1</value></property> <!-- Minimum connection pool size -->
        <property name="maxPoolSize"><value>20</value></property> <!-- Max connection pool size -->
        <property name="maxConnectionAge"><value>3600</value></property> <!-- Set max connection age to 1 hour, after it will release -->
        <property name="maxIdleTime"><value>600</value></property> <!-- 10 minutes connection can stay unused before be discarded -->
        <property name="checkoutTimeout"><value>200000</value></property> <!-- Each what time check for unused connections -->
        </bean>

现在我的密码是空白的,但我应该有一个。怎么保护??

谢谢你。

4

3 回答 3

1

使用新的 BCryptPasswordEncoder:

http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/security/crypto/bcrypt/BCryptPasswordEncoder.html

它会自动为您添加密码。

我推荐 BCrypt,因为它很强大,速度很慢,并且没有已知的弱点。“慢”实际上是散列算法中你想要的一个特性,因为这意味着如果有人窃取了你的密码,它需要更长的时间来破解。

SHA 256 被削弱。MD5肯定坏了。

在 xml 文件中存储用户/散列密码的优点是简单。但是,您需要重新启动应用程序才能进行更改。此外,没有用户自我管理。

有一种encode方法BCryptPasswordEncoder可以让您对密码进行编码以存储在 xml 或数据库中。

于 2013-07-30T18:47:21.380 回答
0

当您存储密码时,您必须至少对其进行散列(多次,例如 1000)并对其进行加盐。

多次散列是必不可少的,因为如果有人试图破解密码,他也需要像你一样多次对输入进行散列:这让黑客失去了时间。

加盐可防止黑客使用哈希密码的反向表。

您还应该为每个用户使用不同的盐。

在这里,您的密码在配置文件中加密,没有任何盐,我只需使用反向表来查找相应的密码。

编辑:实际上,我试过了。您的第一个密码是“用户”。您的第二个密码是“ admin ”。我让他们使用这个简单的公开可用的反向表

于 2013-07-30T13:22:42.713 回答
0

不要将两个用户硬编码为两个角色。使用该应用程序的每个人都应该是拥有自己的用户名和密码的个人用户。单个用户将具有一个或两个角色。

考虑到这一点,很明显您需要将用户数据存储在数据库中。您的用户表应该包含用户名、散列密码、盐和您需要的任何其他字段。

您应该有另一个包含角色的表,以及另一个将用户映射到角色的表。

创建用户时,您应该使用加密随机生成器生成盐,例如 SecureRandom. 散列密码是使用散列算法创建的,salt、spring security 有一个ShaPasswordEncoder这样做的(它还支持多个散列迭代)。

我建议阅读 spring 安全文档,特别是http://static.springsource.org/spring-security/site/docs/3.1.x/reference/ns-config.html#ns-auth-providers

于 2013-07-30T13:48:35.393 回答