Я подозреваю, что ошибка здесь:
private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
// ... snip ...
int rounds = 1 << logRounds;
// ... snip
}
Когда вы задаете 31 для logRounds
, он вычисляется как 2 ^ 32, который не может поместиться в int
и переполняется, поэтому хеш фактически выполняется в ... ээ, нулевых проходах. Автор должен был использовать uint
вместо этого. Легко исправить!
Также хотел бы прокомментировать это:
Я понимаю, что нам, вероятно, не понадобится случайно сгенерированная соль из 30 символов для создания наших хэшей паролей ...
Обратите внимание, что параметр logRounds
не относится к количеству символов / байтов в соли, которое всегда равно 16. Это относится к логарифмической базе числа проходов, которые хеш будет использовать для вычисления; другими словами, это способ масштабирования bcrypt с помощью закона Мура, что делает вычисление функции на несколько порядков дороже, если компьютеры когда-либо становятся достаточно быстрыми для взлома существующих хешей.