Как известно, у /dev/random, криптографически стойкого генератора псевдослучайных чисел (CSPRNG), имеется одна неприятная проблема – блокировки. В данной статье рассказывается, каким образом можно ее решить.
За последние несколько месяцев средства генерации случайных чисел в ядре были немного переработаны, но проблемы в этой подсистеме решались на протяжении более широких
временных рамок. Самые
последние изменения были сделаны с целью предотвратить длительную блокировку системного вызова getrandom () при загрузке системы, но причиной, лежащей в основе этого, было поведение блокирующего случайного пула. Недавний патч удалил бы этот пул, и, следовало ожидать, что он направится к основному ядру.
Энди Лутомирски (Andy Lutomirski) опубликовал третью версию патча в конце декабря. Он вносит
«два основных семантических изменения в случайных API Linux». Патч добавляет новый флаг GRND_INSECURE к системному вызову getrandom() (хотя Лутомирский обращается к нему как к getentropy(), который реализован в glibc с помощью getrandom() с фиксированными флагами); этот флаг заставляет вызов всегда возвращать количество запрошенных данных, но без гарантии, что эти данные случайны. Ядро просто приложит все усилия, чтобы дать наилучшие случайные данные, которые у него есть на данный момент времени.
«Вероятно, лучшее, что можно сделать, это назвать его „INSECURE“ (небезопасным), чтобы воспрепятствовать использованию этого API для вещей, которые нуждаются в безопасности».