Когда мы запускаем любой тип PRNG, у нас могут быть данные, которые неоднородны по своей энтропии. Например, возможно, наш единственный источник криптографически защищенной случайности — это набор случайных строковых UUID. Однако в большинстве реализаций PRNG мы хотим, чтобы наша случайность была однородной и имела фиксированный размер. Чтобы получить это, нам нужен какой-то способ преобразовать входные данные в соответствующий размер, и хеш-функция — простой способ сделать это.
Когда у нас есть некриптографический PRNG, входные данные, предоставленные пользователем, часто могут быть любого размера, и часто бывает полезно позволить пользователю предоставить произвольное начальное число. Например, некоторые видеоигры позволяют вам заполнять их PRNG произвольным текстом, чтобы воспроизвести ту же игру, и это необходимо преобразовать в подходящий вход, для которого хорошо подходит хэш-функция. Соль в этом случае не будет так полезна, поскольку цель состоит в том, чтобы получить детерминированный результат.
Когда мы используем CSPRNG, используемый нами алгоритм является детерминированным, но мы хотим заполнить его входными данными с достаточной энтропией, чтобы гарантировать, что его вывод нельзя будет угадать. То есть наша цель — недетерминированный вывод. В некоторых проектах выбрана принудительная однородная энтропия входных данных, но в большинстве проектов используется какая-то функция вывода, например та, что используется в CTR_DRBG, чтобы разрешить неравномерные входные данные. Иногда эти алгоритмы основаны на хеш-функции, а иногда нет. Например, CTR_DRBG использует функцию вывода на основе блочного шифра, чтобы сделать весь алгоритм реализуемым только с реализацией AES. HMAC_DRBG использует в этой роли HMAC, основанный на хеше.
Проекты DRBG позволяют использовать соль или строку персонализации, и это часто рекомендуется. Фиксированная или неслучайная соль не улучшит безопасность при недостаточной энтропии, поскольку мы предполагаем, что соль общедоступна, но есть контексты, в которых она может быть полезна, например, если несколько DRBG должны быть заполнены из одних и тех же входных данных энтропии.
В некоторых случаях мы используем дизайн CSPRNG для детерминированного вывода, который неотличим от случайного, и соль здесь полезна. Например, в RFC 6979, описывающем детерминированные DSA и ECDSA, мы используем HMAC_DRBG для создания случайного значения. $к$. Закрытый ключ — это наша энтропия, а хэш сообщения — это соль, и оба они необходимы для безопасности.