pjk*_*ser 2 jbcrypt password-encryption
自从2010年问世以来,我一直在使用jBCrypt版本0.3开箱即用.我使用默认的getalt()方法将"log_rounds"的数量设置为10.鉴于密码破解硬件的进展和方法,这个值仍然适合作为默认值,或者我应该看一些更高的值.
来自javadoc的信息......
String pw_hash = BCrypt_v03.hashpw(plain_password, BCrypt_v03.gensalt());
String strong_salt = BCrypt_v03.gensalt(10)
String stronger_salt = BCrypt_v03.gensalt(12)
Run Code Online (Sandbox Code Playgroud)
工作量呈指数增长(2**log_rounds),因此每个增量是工作量的两倍.默认log_rounds为10,有效范围为4到31.
我做了一个小测试类来检查checkPw()在不同的salt log_rounds下的性能.
public void testCheckPerformance() {
int MULT = 1;
for( int i = 4; i < 31; i++) {
String salt = BCrypt_v03.gensalt(i);
String hashpw = BCrypt_v03.hashpw("my pwd", salt);
long startTs = System.currentTimeMillis();
for( int mult = 0; mult < MULT; mult++) {
assertTrue(BCrypt_v03.checkpw("my pwd", hashpw));
}
long endTs = System.currentTimeMillis();
System.out.println(""+i+": " + ((endTs-startTs)/MULT));
}
}
Run Code Online (Sandbox Code Playgroud)
我的电脑是8核i7 2.8GHz.结果是:
log-rounds: time in millis.
4: 3
5: 3
6: 6
7: 11
8: 22
9: 46
10: 92
11: 188
12: 349
13: 780
14: 1449
15: 2785
16: 5676
17: 11247
18: 22264
19: 45170
Run Code Online (Sandbox Code Playgroud)
使用默认的log_rounds = 10意味着单个线程可以在0.1秒内检查登录.这可能会限制单个服务器每秒可以实现的登录检查次数.
所以我想问题就是你准备花多少时间进行每次密码检查,以及每秒需要多少次密码检查来确定系统应对的大小.