Как упоминалось в комментариях, bcrypt — это хэш пароля, и он имеет значительные ограничения по сравнению с обычной криптографической хэш-функцией.
Использование его по назначению для ввода пароля, но с той же солью, что и при вводе, так же безопасно, как и полное отсутствие соли. Целью соли является предотвращение многоцелевых атак и предотвращение использования радужных таблиц. Если соль та же, что и на входе, это разрешает эти атаки, поскольку злоумышленник теперь знает, какой будет соль для заданного целевого пароля.
Использование его в качестве общей хэш-функции приводит к совершенно другому набору проблем, худшей из которых являются коллизии. bcrypt имеет 72-байтовый предел ввода для входного текста, если вы хэшируете большие фрагменты данных, он будет иметь тот же хэш, что и его 72-байтовый префикс. bcrypt также повторяет короткие входные данные, пока не заполнит 72-байтовый массив состояния, поэтому 18-символьный пароль будет иметь тот же вывод, что и этот пароль, повторенный 4 раза. Реализации могут предварительно хешировать ввод с помощью чего-то вроде SHA-512, прежде чем он попадет в bcrypt, что предотвращает эти проблемы. Хотя в этом случае, несмотря на то, что он медленный, его выход по-прежнему имеет длину всего 192 бита, что существенно ограничивает его устойчивость к коллизиям для использования в таких вещах, как цифровые подписи.
Со всеми этими ограничениями есть явно лучшие варианты, если вы хотите замедлить хэш-функцию, наиболее очевидным из которых является просто повторное выполнение вывода хеш-функции. Это также менее сложно, чем bcrypt, и может позволить вам повторно использовать уже существующие функции как в программном, так и в аппаратном обеспечении. Если вы беспокоитесь о том, чтобы по какой-то причине застрять в хеш-цепочке, вы всегда можете добавить к входным данным простое слово счетчика итераций.Для некоторых параметризованных хэш-функций вы также можете увеличить внутренний счетчик раундов. Keccak, например, может быть легко расширен для использования большего количества раундов, некоторые реализации, которые алгоритмически генерируют раундовые ключи, могут потребовать изменения только одной строки кода.