Я наткнулся на BCrypt.net после прочтения сообщения Джеффа Этвуда о хранении паролей, что привело меня к рекомендации Томаса Птачека использовать BCrypt для хранения паролей. Что, наконец, привело меня к этой реализации С# для BCrypt
В комментариях к последнему сообщению выше кто-то спросил: "Почему GenerateSalt (30) берет навсегда, но GenerateSalt (31), кажется, не занимает времени вообще?"
Я запустил BCrypt.HashPassword(пароль, BCrypt.GenerateSalt(31)) и получил мой результат в 0 миллисекунд.
Я запускаю BCrypt.HashPassword( "пароль", BCrypt.GenerateSalt(30)) уже более 5 минут и по-прежнему не имеет результата.
Я понимаю, что нам, вероятно, не понадобится беспорядочно сформированная соль из 30 символов для создания хэшей паролей (или необратимого шифрования в случае BCrypt) в течение многих лет. EDIT Мне нужно немного прочитать код, logRounds не имеет ничего общего с длиной соли. Спасибо Aaronaught.
Итак, почему GenerateSalt (31) возвращает значение почти мгновенно (когда это займет примерно в два раза больше, чем GenerateSalt (30)?
UPDATE
здесь есть исправление:
private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
// ... snip ...
uint rounds = 1U << logRounds;
// ... snip
}