Использование jBCrypt для засолки паролей в Android App вызывает длительное зависание
Я использую библиотеку jBCrypt для хеширования паролей пользователей, когда они регистрируются с помощью моего приложения.
Я использую базовую хеш-функцию с солью, вот так:
String pass = BCrypt.hashpw(rawPass, BCrypt.gensalt());
Я заметил зависание на одну-две минуты при регистрации и проверил отладчик, подтверждая, что BCrypt ответственен.
Действительно ли засолка пароля требует такой большой вычислительной мощности? Если да, будет ли хорошей альтернативой отправка незашифрованного пароля на сервер для его хеширования? Моя первоначальная мысль по этому поводу состояла в том, чтобы хэшировать ее до того, как ее отправят куда-либо. Есть идеи?
1 ответ
Вот статья, в которой перечислены время, проведенное на ноутбуке Mac с процессором Core 2 Duo. Так что, да, Bcrypt, вероятно, будет очень медленным на мобильном устройстве.
Другой распространенной проблемой является инициализация SecureRandom
который может быть очень медленным, а также зависать из-за отсутствия достаточного количества случайных данных. Это будет зависеть от разных машин и операционных систем. Вы найдете множество обсуждений этого в другом месте, но это то, что вы, возможно, захотите проверить, либо инициализировать его самостоятельно, используя new SecureRandom()
или по телефону gensalt
отдельно, чтобы изолировать случайное генерирование данных, а затем просто время вызова hashpw
,
Другой вопрос: почему вы действительно хотите хэшировать это на клиенте? Если вы храните его на клиенте и регистрируетесь локально, тогда это может иметь некоторый смысл, но если оно отправляется на сервер, а при обычном входе в систему используется отправка незашифрованного пароля на сервер, то вы ничего не получаете. Кроме того, распространенным заблуждением является то, что хеширование пароля перед отправкой его на сервер (при входе в систему) обеспечивает некоторую защиту, хотя на самом деле это эквивалентно отправке открытого текста пароля. Злоумышленник может получить хеш, чтобы получить доступ.
Хэширование паролей является средством предотвращения доступа злоумышленника (или, по крайней мере, его замедления), если само хранилище паролей будет взломано.
Таким образом, если пароль хранится на сервере, он должен быть отправлен в виде открытого текста (по защищенному каналу), и сервер должен принять решение о том, как он хешируется.