Проблема, с которой я столкнулся с bcrypt, заключается в том, что модуль нельзя импортировать в приложение Pythonista на iOS, где мне нужно запустить мой скрипт. Что еще вы могли бы порекомендовать, как bcrypt, который может генерировать случайную соль и имеет что-то вроде встроенной функции checkpw() для быстрой проверки соленых паролей?
Если pbkdf2 изначально доступен, я бы использовал его, прежде чем пытаться свернуть свой собственный bcrypt. Когда его рабочие факторы достаточно велики, это все еще хороший выбор, когда bcrypt или scrypt недоступны, и его использование напрямую безопаснее, чем пытаться воссоздать что-то еще вручную.
Не зная больше о вашем варианте использования, общая рекомендация: используйте pbkdf2 с достаточно большим количеством раундов, чтобы занять примерно полсекунды верхней границы пропускной способности процессора ваших целевых устройств. Это удерживает UX в пределах допустимого времени ожидания, но при этом обеспечивает разумную устойчивость к атакам в автономном режиме.
Я бы также рекомендовал рандомизировать это количество раундов немного больше диапазона (например, тысячи). Например, если вы остановились на 200 000 как на приемлемой задержке в 500 мс, я бы случайным образом выбрал значение от 200 000 до 202 000 (или что-то в этом роде) — все, что необходимо для обеспечения того, чтобы у большинства пользователей были разные раунды друг от друга (при условии, что что все пароли пользователей могут быть собраны в одном месте, которое может быть скомпрометировано, а хэши украдены). Это связано с тем, что некоторые из новых «ассоциативных»/«корреляционных» атак хорошо работают только против большого набора хэшей, когда все факторы стоимости для этого набора хэшей одинаковы.
В долгосрочной перспективе также убедитесь, что ваш код легко принимает переменный нижний и верхний предел количества циклов, поэтому вы можете увеличить количество раундов с течением времени по мере развития процессоров. (Вы даже можете проявить фантазию и динамически вычислить диапазон раундов на основе процессора, на котором создается пароль, чтобы он был готов к будущему без какого-либо дополнительного вмешательства.)