В настоящее время я использую определенную схему для защиты паролей, и я думаю, что у меня есть некоторые моменты для улучшения. Реализация выполняется на Java, поэтому я предпочитаю использовать SHA-2 512 в качестве формы шифрования.Безопасность паролей
В настоящее время у меня есть модели клиент-сервер, так что эти вещи могут случиться:
- клиент хочет войти, он посылает свой пароль с один раз нормальный SHA-2 512 шифрования по сети.
- Сервер имеет пароли, хранящиеся в базе данных, например, SHA-2_512 (SHA-2_512 (пароль) + соль), причем внутренний SHA-2_512 (пароль) является «зашифрованным» паролем, который он получает по сети.
- Проверка пароля выполняется на стороне сервера, и нет никакого способа просачиваться с сервера, единственной возможной уязвимостью было бы, если бы кто-то мог прочитать RAM, я думаю.
У меня есть следующие вопросы:
Злоумышленник обычно создает атаки коллизий при желании взломать пароль. Однако насколько достаточны атаки на столкновение? Если пароль нужно использовать для других приложений, таких как Outlook.com, Facebook или что-то еще (что, вероятно, использует другую соль, так как они не имеют ничего общего с моими приложениями), как это такое? Вам не нужен настоящий пароль?
Имеет ли SHA-2 512 уже итерацию? И даже если это так, следует ли мне изменить методы шифрования для автоматического использования нескольких итераций, а также сколько итераций предпочтительнее? Я также читал об использовании случайного числа итераций (в диапазоне), как я могу хранить случайный фактор детерминированно?
Должен ли я хранить системные секреты для каждой итерации кода сервера? См. http://blog.mozilla.org/webappsec/2011/05/10/sha-512-w-per-user-salts-is-not-enough/. Я мог бы хранить массив, который будет хранить статический секрет для каждой итерации, причем n-й секрет для n-й итерации. Никто не может знать секреты, они вычисляются один раз (я думаю, как шифрование некоторой случайной строки), а затем в основном хранятся в ОЗУ сервера.
В настоящее время я отправляю введенный пароль от клиента на сервер как только SHA-2_512 (пароль), если этот процесс будет улучшен, и если да, то как? Я не могу использовать соли, потому что у клиента нет соли.
С уважением.
Я немного изучил, и я думаю, что это важная нота для добавления: BCrypt следует делать на стороне клиента для авторизации (и на стороне сервера один раз для регистрации/пароля изменение). Таким образом, стресс на сервере действительно очень низкий. Исправьте меня, если не прав. Есть ли способ определить хороший коэффициент работы? – skiwi
@skiwi Я не думаю, что вы должны выполнить вычисление bcrypt на стороне клиента. Не могли бы вы поделиться своими рекомендациями? Усилие на сервере для использования bcrypt по-прежнему довольно низкое, но стресс для злоумышленника, пытающегося наброситься на него, попробовав 1000 догадок, очень высок. – Steve
Посмотрите на http://stackoverflow.com/questions/4443476/optimal-bcrypt-work-factor для определения коэффициента работы. – Steve