如何为BCryptPasswordEncoder的构造函数添加参数以使其更强大?

时间:2014-03-20 02:29:25

标签: spring-security encode bcrypt

我已经在我的spirngsecurity上实现了bCryptPasswordEncoder,目前我正在使用它的简单构造函数,没有任何争论,我怎样才能让它更强大?

question之后,我尝试使用random和512作为其强度,但它找不到声明的命名空间。

 <beans:beans xmlns='http://www.springframework.org/schema/security' 
                 xmlns:beans='http://www.springframework.org/schema/beans' 
                 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
                 xsi:schemaLocation='http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security-3.1.xsd'
    xmlns:c='http://www.springframework.org/schema/c'>

    .....
    </authentication-manager> 
    <beans:bean id='bCryptPasswordEncoder' class='org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' c:strength="512" c:random="20"/>
    </beans:bean>

我的代码

    SecureRandom random = new SecureRandom();
    byte bytes[] = new byte[20];
    random.nextBytes(bytes);
    PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(512, random);
    String digest = passwordEncoder.encode(rawPassword);
    System.our.println(digest);

错误如下

    Error: File not found in the specified address : http://www.springframework.org/schema/c

的pom.xml

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>3.1.1.RELEASE</version>
        </dependency>

2 个答案:

答案 0 :(得分:1)

您缺少'c'架构的schemaLocation声明。只需删除它并使用普通bean声明:

<beans:bean id='bCryptPasswordEncoder' class='org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder'>
    <beans:constructor-arg value="12" />
</beans:bean>

在尝试将其配置为“使其更强大”之前,您应该阅读BCrypt,并且还能够解释为什么默认值不足以满足您的要求。 strength参数是对数的,默认为10.每次增加它时,您需要的工作量和应用程序检查密码所需的时间加倍。所以512的值没有任何意义。如果您提供的值大于31,则会出现错误。

另外,我不知道你为什么要在XML配置中将random实例设置为20。该参数必须是SecureRandom实例,因此您应该删除它。

答案 1 :(得分:0)

BCryptPasswordEncoder API文档缺少输入参数。

关于“强度”,它提到这是“使用的日志轮次”并且默认为10.源补充说,这个数字是“要应用的散列轮数的log2”,因此工作因子增加2个** log_rounds”。

关于“SecureRandom”参数,源只说“要使用的SecureRandom实例”,可以看出,如果没有提供,Spring Security会使用“new SecureRandom()”实例化其中一个。然后它执行“byte rnd [] = new byte [BCRYPT_SALT_LEN];”其中BCRYPT_SALT_LEN为16并使用“random.nextBytes(rnd);”将rnd随机提供给随机数。 SecureRandom是一个CSPRNG(密码安全伪随机数生成器),你唯一可以改变的是种子值。播种的最大因素是独特性。

作为问题的实际答案,除了缺少schemaLocation之外,为了加强编码,你可以将“强度”增加到更高的数字,31是最大值,但在大多数情况下,默认值10应该最适合用户需求。您也可以提供自己的SecureRandom实例,但我怀疑允许Spring为您处理这个实例有什么优势。