2013-07-30 46 views
2

美好的一天开发商。 我有问题。在我的web应用程序中,我使用弹簧安全。我有2个简单的角色:用户,管理员。对于这些规则中的每一个,我都有自己的密码,因为所有人对我的网络应用都有不同的访问权限。因此,我现在将所有密码存储在SHA-256哈希编码的security.xml中:将密码存储在xml security-context.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> 

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

谢谢。

+0

您的最佳保护是保护您的数据存储。无论是数据库,平面文件还是其他任何内容都无关紧要。如果暴露出来,密码开始找到真的只是一个时间问题。 –

+0

好吧我使用数据库在我的app-config.xml中配置数据源,我真的不知道如何隐藏它。对应您的回复,我如何保护它。为了更多的理解,我添加将添加我的app-config.xml。谢谢科林。 –

回答

1

使用新BCryptPasswordEncoder:

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

它会自动盐您的密码给你。

我推荐BCrypt,因为它强壮,速度慢,并且没有已知的弱点。“缓慢”实际上是你想要的一种哈希算法的特性,因为这意味着如果有人窃取你的密码需要更长的时间才能破解。

SHA 256是weakened。 MD5肯定是坏了。

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

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

+0

谢谢主席先生,你好回答 –

+0

先生让我请你问。例如,我必须将我的普通密码(比如“user”)作为BCrypt,并在创建bean BCryptPasswordEncoder后用于在用户将其输入为明文时识别我的密码。对?? –

+0

您链接的文章解决了由于冲突而使用散列作为地址的弱点。散列密码是完全不同的球类游戏。 – Qwerky

0

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

散列几次是非常重要的,因为如果有人试图啃密码,他还需要尽可能多地散列输入,这样做会让黑客宽松时间。

Salting可防止黑客使用散列密码的反向表。

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

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

编辑:其实,我试过。您的第一个密码是“用户”。您的第二个密码是“admin”。我得到了他们使用这个简单的公开可用reverse table

+0

首先,你根本不应该加密密码,你应该_hash_他们。加密是可逆的,哈希不是。其次,你不应该只是“重复几次”。如果你愿意,你可以'密码'2000次,它不会比一次安全。黑客无需对其进行2000次散列,(s)他只需要找到另一个输入,在'md5'd时生成相同的散列。您应该使用多轮加密安全算法,如blowfish –

+0

但是如果我只在我的security.xml中预安装了密码,它会如何工作(腌制和加密)?我认为我不能使用腌制,因为当我为愿意使用我的Web应用程序的用户注册系统时会生成密码。添加随机字符输入密码?我想念什么?还有Cryting,那它呢?哈希是不够的?据我所知,隐藏我的密码的一种方式,并很难让它回到明文? –

+0

@Colin好的哈希,我编辑。对于第二部分,我不同意。破解密码的目的是为了能够使用它来登录系统。您输入的登录名将被系统散列2000次,因此您需要散列2000次以确保散列的密码对应。顺便说一句,我接受这个来自'www.owasp.org'的建议。 –

0

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

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

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

创建用户时,应使用加密随机生成器(如SecureRandom)生成盐。散列密码是使用散列算法创建的,salt,spring security有这样做(它也支持多次散列迭代)。

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

+0

谢谢你的回复先生。我的应用程序将从一个地方进行控制,就像这个负责将数据放入数据库并将其删除的地方一样。这个搜索页面女巫的其他部分应用程序将没有安全性。它负责搜索存储在该地点的数据库中的数据。我保护删除页面jsp访问仅限admin,并输入页面jsp用户角色和管理员角色。在security.xml中声明的用户和管理员的PERMANENT密码如何绑定salt + HASH。无法理解这一点。 –