jBCrypt的默认log_rounds是否仍然适用于2013年



自从 2010 年问世以来,我一直在使用开箱即用的 jBCrypt 版本 0.3。我使用默认的 getsalt() 方法,该方法将"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)

工作量呈指数级增长 (2**log_rounds),因此每次增量都是两倍的工作量。默认log_rounds为 10,有效范围为 4 到 31。

我做了一个小测试类来检查checkPw()在不同盐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));
    }
}

我的电脑是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

使用默认的 log_rounds=10 意味着单个线程可以在 0.1 秒内检查登录。这可能会限制单个服务器每秒可以实现的登录检查次数。

所以我想问题变成了您准备在每次密码检查中花费多少时间,而不是每秒要调整系统大小以应对多少密码检查。

相关内容

  • 没有找到相关文章

最新更新