Сейчас я использую растяжение пароля для всех паролей учетных записей пользователей на всех моих сайтах. В БД я храню счетчик итераций и случайно назначенную соль вместе с окончательным хешем. Я использую SHA512 в качестве алгоритма хеширования. Для этого я использую C # в .Net 3.5 и 4.0 (двойная библиотека фреймворков).
Для учетных записей, которые когда-либо получают только случайно назначенные пароли (например, пользователи API веб-служб и т. Д.), Я уменьшаю счетчик итераций до такого диапазона, чтобы проверка пароля занимала не более 1 секунды или около того. С годами, в зависимости от того, придерживаются ли эти сайты (!), Я буду смотреть на увеличение этих диапазонов в соответствии с мощностью процессора.
Для учетных записей, в которых пользователь может самостоятельно выбирать пароль, я увеличил количество итераций, поэтому вход в систему может занять около 5 секунд, пока выполняются итерации.
Так что я доволен безопасностью своих паролей; но теперь у меня есть другая проблема - я могу залить 8-ядерный процессор со 100% использованием в течение 5 секунд, если я получу 8 разных людей для входа в систему сразу!
Мое текущее решение для этого состоит в том, чтобы иметь порог итерации: если операция растяжения превышает это, я помещаю его в очередь, которая обрабатывается одним потоком. Я мог бы расширить это так, чтобы он использовал не более половины процессоров в машине.
Есть ли что-нибудь лучшее, что я могу сделать? Вы реализовали этот шаблон для хранения пароля и входа в систему - что вы делали?