%20%D0%B4%D0%BB%D1%8F%20%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%20stack_canary%20%D0%B8%D0%BB%D0%B8%20stack_top%3F.png)
В ядре Linux есть генератор случайных чисел. Обычно он называется LRNG (Linux Random Number Generator). Мы можем использовать его, вызвав get_random_bytes()
. Но stack_canary
и stack_top
генерируются get_random_int()
. Хотя в ядре Linux есть собственный хороший генератор случайных чисел (LRNG), почему ядро Linux генерирует его get_random_int()
? Я думаю, что это может быть из-за эффективности. Это верно?
решение1
Толькопрочитать источник:
Получить случайное слово только для внутреннего использования ядра. Аналогично urandom, но с целью минимального истощения пула энтропии. В результате случайное значение не является криптографически безопасным, но для нескольких применений стоимость истощения энтропии слишком высока
Вот почему get_random_int
не просто берет вывод get_random_bytes
. Как оказалось, аргументы здесь неверны по двум причинам:
- Энтропия на самом деле не истощается. Это просто фиктивный расчет внутри ядра.
- Даже если бы энтропия истощалась, это не было бы причиной не использовать криптографически безопасный генератор псевдослучайных чисел вместо специальной конструкции. Просто используйте отдельный экземпляр от того, который истощает энтропию для
/dev/random
. Производительность может быть причиной, но разница между надлежащим CSPRNG, таким как Hash_DRBG/SHA-2, и специальной конструкцией здесь с использованием MD5 крошечная.
решение2
Linux'ы /dev/random
, /dev/urandom
, и get_random_bytes()
привязаны к одному и тому же внутреннему пулу энтропии. Вполне возможно осушить его при использовании только для RNG и вызвать /dev/random
блокировку и /dev/urandom
выдачу выходных данных с низкой энтропией. Это условие низкой энтропии создает проблемы для криптографии.