我已经在我的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>
答案 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为您处理这个实例有什么优势。