Подходят ли значения по умолчанию для jBCrypt для 2013 года?

Я использую jBCrypt версии 0.3 "из коробки" с тех пор, как она появилась в 2010 году. Я использую метод по умолчанию 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.

1 ответ

Я сделал небольшой тестовый класс, чтобы проверить производительность 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,8 ГГц. Результаты:

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 с. Это потенциально ограничивает количество проверок входа в секунду, которое может выполнить один сервер.

Поэтому я думаю, что вопрос заключается в том, сколько времени вы готовы потратить на проверку пароля, а сколько проверок пароля в секунду вы хотите настроить, чтобы система могла справиться.

Другие вопросы по тегам