Использование jBCrypt для засолки паролей в Android App вызывает длительное зависание - PullRequest
8 голосов
/ 02 октября 2011

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

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

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

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

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

1 Ответ

11 голосов
/ 13 декабря 2011

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

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

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

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

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

...