Java 在xml security-context.xml或数据库中存储密码的最佳实践?

Java 在xml security-context.xml或数据库中存储密码的最佳实践?,java,database,spring,spring-security,hashcode,Java,Database,Spring,Spring Security,Hashcode,你好,开发者。 我有个问题。在我的web应用程序中,我使用spring安全性。我有两个简单的角色:用户,管理员。对于这些规则中的每一条,我都有自己的密码,因为它们对我的web应用程序都有不同的访问权限。因此,我现在将所有密码以sha-256哈希编码存储在security.xml中: <security:http pattern="/search" security="none" /> <security:http auto-config="true" >

你好,开发者。 我有个问题。在我的web应用程序中,我使用spring安全性。我有两个简单的角色:用户,管理员。对于这些规则中的每一条,我都有自己的密码,因为它们对我的web应用程序都有不同的访问权限。因此,我现在将所有密码以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>

org.h2.Driver
jdbc:h2:/home/vadim/workspace-sts-3.1.0.RELEASE/h2/EDUCATION
sa
3.
1.
20
3600
600
200000
现在我的密码是空的,但我应该有一个。如何保护它


谢谢。

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

多次散列是必要的,因为如果有人试图窃取密码,他也需要像你一样多次散列输入:这会让黑客失去时间

Salting防止黑客使用哈希密码的反向表

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

在这里,在配置文件中对您的密码进行了加密(不含任何盐),我将使用一个反向表来查找相应的密码


编辑:事实上,我试过了。您的第一个密码是“user”。您的第二个密码是“admin”。我使用这个简单的公开版本获得了它们。

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

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

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

创建用户时,应使用加密随机生成器(如)生成salt。散列密码是使用散列算法创建的,salt,spring安全性有一个实现这一点的方法(它还支持多次散列迭代)


我建议阅读spring安全文档,特别是使用新的BCryptPasswordEncoder:

它会自动为您添加密码

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

沙是。MD5肯定坏了

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


BCryptPasswordEncoder
上有一个
encode
方法,可以对密码进行编码,以存储在xml或数据库中

首先,你不应该加密密码,你应该散列它们。加密是可逆的,散列不是。其次,你不应该只是“重复几次”。你可以
md5
2000次密码,如果你愿意的话,它只会安全一次。黑客不必对其进行2000次散列,他只需要找到另一个输入,在
md5
'd时生成相同的散列。您应该使用多轮加密安全算法,例如Blowfish,但是如果我在security.xml中预先安装了密码,那么它应该如何工作(satting和crypting)??我想我不能使用salting,因为当我有注册系统时,它会为愿意使用我的web应用程序的用户生成密码。将随机字符添加到输入的密码??我错过什么了吗?还有加密呢?散列还不够吗?据我所知,这是一种隐藏密码的方法,很难将其恢复为明文?@Colin Ok for Hash,我编辑。至于第二部分,我不同意。破解密码的目的是能够使用它登录系统。您将输入的登录名将被系统哈希处理2000次,因此您需要哈希处理2000次,以确保哈希处理后的密码对应。顺便说一句,我接受了
www.owasp.org
@USER\u JVM的建议:我不知道spring security提供的选项,但如果您使用此配置,它显然是不安全的,因为我花了30多岁才找到您的密码。您可能更喜欢ApacheShiro来处理您的安全问题。@ArnaudDenoyelle这是正确的。对不起,我说的是另一件事。第2000次在图像上的安全性并不比第一次高,但您可以肯定的是,暴力攻击需要更长的时间。您最好的保护是保护数据存储。无论是数据库、平面文件还是其他任何内容都无关紧要。如果这被暴露了,那么在密码开始被发现之前真的只是一个时间问题。好的,我在app-config.xml中使用数据库来配置数据源,我真的不知道如何隐藏它。对应您的回复,我如何保护它。为了进一步了解,我将添加app-config.xml。谢谢你,科林。谢谢你的回复,先生。我的应用程序将由一个地方控制,像这个地方负责将数据放入数据库并删除它们。此搜索页面的应用程序的其他部分将没有安全性。它负责搜索存储在那个地方的数据库中的数据。我只为管理员和输入页面jsp用户角色和管理员角色保护删除页面jsp访问。如何为security.xml中声明的用户和管理员的永久密码绑定salt+HASH。我不明白,先生,让我问你。我得把我的普通护照换下来