Использование jBCrypt для соли паролей в приложении Android вызывает длительное зависание

#java #android #passwords #bcrypt #jbcrypt

#java #Android #пароли #bcrypt #jbcrypt

Вопрос:

Я использую библиотеку jBCrypt для хэширования паролей пользователей, когда они регистрируются с помощью моего приложения.

Я использую базовую хэш-функцию с солью, например:

 String pass = BCrypt.hashpw(rawPass, BCrypt.gensalt());
  

Я заметил зависание на одну-две минуты при регистрации и проверил отладчик, подтвердив, что за это отвечает BCrypt.

Действительно ли соление пароля требует такой большой вычислительной мощности? Если да, то хорошей альтернативой было бы отправить открытый текстовый пароль на сервер для его хэширования? Моя первоначальная мысль по этому вопросу заключалась в том, чтобы хэшировать его до того, как он будет отправлен куда угодно. Есть идеи?

Комментарии:

1. Ну, в некотором смысле, bcrypt предназначен именно для этого. Конечно, если это вызывает такое длительное зависание в клиенте, это неприемлемо.

2. Вы пытались запустить процесс хеширования в другом потоке, помимо пользовательского интерфейса? (например: android.os. AsyncTask)

Ответ №1:

Вот статья, в которой перечислены времена, проведенные на ноутбуке Mac с процессором Core 2 Duo. Итак, да, Bcrypt, вероятно, будет очень медленным на мобильном устройстве.

Другой распространенной проблемой является инициализация SecureRandom , которая может быть очень медленной, а также может зависать из-за отсутствия достаточного количества случайных данных. Это зависит от разных компьютеров и операционных систем. Вы найдете много обсуждений этого в другом месте, но это то, что вы, возможно, захотите протестировать, либо инициализировав его самостоятельно, используя new SecureRandom() или вызывая gensalt отдельно, чтобы изолировать генерацию случайных данных, а затем просто время вызова hashpw .

Другой вопрос, почему вы на самом деле хотите хэшировать его на клиенте? Если вы сохраняете его на клиенте и входите в систему локально, то это может иметь некоторый смысл, но если он отправляется на сервер, а обычный вход в систему включает отправку открытого текстового пароля на сервер, тогда вы ничего не получаете. Кроме того, распространенным заблуждением является то, что хеширование пароля перед отправкой его на сервер (при входе в систему) обеспечивает некоторую защиту, хотя на самом деле это эквивалентно отправке открытого текстового пароля. Злоумышленнику нужно только получить хэш, чтобы получить доступ.

Хеширование паролей — это средство предотвращения получения доступа злоумышленником (или, по крайней мере, замедления их), если само хранилище паролей будет скомпрометировано.

Поэтому, если пароль хранится на сервере, он должен быть отправлен в виде открытого текста (по защищенному каналу), и сервер должен принять решение о том, как он хэшируется.

Комментарии:

1. Разница между отправкой хэша пароля от клиента на сервер и отправкой пароля в виде открытого текста заключается в том, что если он перехвачен, он действителен только для этого домена. Междоменные компромиссы (люди, повторно использующие один и тот же пароль на нескольких сайтах) довольно распространены.

2. @StevePomeroy BCrypt использует случайную соль, поэтому на практике вы не могли проверить пароль, если он не был сохранен в виде открытого текста на сервере или вы отправили соль клиенту до того, как он рассчитал хэш. Если вы используете защищенный канал, такой как HTTPS (который вы всегда должны использовать), то вы не сильно выиграете с точки зрения защиты от перехвата при передаче. Компрометация общих паролей обычно является результатом кражи базы данных паролей и находится в виде обычного текста или хэшируется с использованием неправильного выбора алгоритма.