Системные вызовы энтропии
Системные вызовы энтропии -это системные вызовы в Unix, операционной системы ядрах через которые процессы могут получить энтропийные или случайные данные. Первый из них был getentropy
, введенный в операционную систему OpenBSD в выпуске 5.6 (ноябрь 2014 г.), как рефакторинг подхода SYSCTL (3) KERN_ARND, используемого с 1997 года. [ 1 ] Linux предлагает очень похожий системный вызов, getrandom
, который был основан на getentropy
. [ 2 ] Впервые он был доступен в Linux 3.17, выпущенном в октябре 2014 года. [ 3 ] В июле 2015 года Solaris представила слегка измененные версии getentropy
и getrandom
. [ 4 ] В августе 2015 года FreeBSD представил read_random
Системный вызов для получения случайных данных из ядра. [ 5 ]
Эти системные вызовы позволяют процессам получить доступ к качественным случайным данным без открытия и чтения от псевдо-разгонов случайности .
Microsoft Windows ' CryptGenRandom
и iOS яблочный SecRandom
API очень похожи. Тем не менее, они не реализованы в качестве системных вызовов.
Мотивация
[ редактировать ]Традиционно Unix-подобные операционные системы предоставляют случайные данные через два псевдо-расстояния : /dev/random
и /dev/urandom
Полем Тем не менее, безопасное и надежное чтение случайных данных с этих устройств может быть трудным и сложным. Например, злоумышленник может вмешиваться в доступ к процессу к псевдо-разгонам, открывая все доступные дескрипторы файлов или с аналогичной формой атаки истощения ресурсов . Использование этих устройств также мешает отзыву привилегий . Недевилизованные процессы часто отказываются в возможности открытия и чтения файлов и устройств, а устройства случайности даже не видны для хронов процессов .
Сложность использования случайности псевдо-разгонов часто заставляет разработчиков использовать стандартные библиотечные функции. Некоторые из них, такие как программирования C язык rand()
, Posix 's random()
, и drand48()
, очень небезопасны, когда они используются для криптографии или аналогичных приложений, потому что эти алгоритмы фактически детерминированные, и были преднамеренно калечены, чтобы удовлетворить требования к семенам через интерфейсы srand()
, srandom()
, и srand48()
.
Существует значительная разница между этими вызовами: getentropy()
гарантирует, что случайные числа будут возвращены
немедленно, без какого -либо блокировки. Требуется операционная поддержка, которая гарантирует инициализацию потока случайных данных при первой же возможности. Поощрять другие операционные системы следовать этой модели, getentropy()
не может указать ошибки в приложении. Другие вызовы, описанные здесь, могут возвращать ошибки вместо того, чтобы заблокировать неопределенно блокировать. Такая блокирующая семантика была вовлечена в серьезные проблемы. [ 6 ]
Поскольку безопасность становится более распространенным приоритетом в разработке программного обеспечения, случайность качества используется чаще и в большем количестве контекстов. Из -за этого обеспечение качественной случайности становится все более основной ответственностью ядра. Системные вызовы - это традиционный интерфейс, посредством которого процесс использует сервисы основного ядра , а ядра поддерживают доступ к случайности через системные вызовы.
Использование
[ редактировать ]Поскольку это быстрее и добавляет еще один слой смешивания энтропии, обычно предполагается, что процессы используют данные этих Syscalls с помощью криптографически защищенного генератора номеров псевдорядома (CSPRNG), а не присваивания полученных данных непосредственно переменным. Для этой цели стандартная библиотека OpenBSD C включает в себя функцию arc4random
, какие программы ожидают вызову, когда им понадобятся случайные данные. [ 1 ] Нравиться getentropy
, arc4random
Также не может блокировать и не вернуть ошибку.
Этот подход позволяет программе извлекать меньше энтропии из ядра, не уменьшая прочность его случайных данных. А getentropy
Системный вызов разработан на основе этого предположения, поставляя не более 256 байтов за вызов. [ 1 ] [ 7 ]
Смотрите также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а беременный в "GetEntropy (2) страница OpenBSD Man" . OpenBSD Ручные страницы . OpenBSD . Получено 27 мая 2016 года .
- ^ «[Патч, RFC] случайный: ввести системный вызов Getrandom (2)» . LKML . 17 июля 2014 года . Получено 30 декабря 2015 года .
- ^ "Linux 3.17" . Linux ядра новичков . Получено 30 декабря 2015 года .
- ^ Даррен, Моффат. «Соларис новых системных вызовов: getEntropy (2) и getrandom (2)» . /dev/urandom . Оракул. Архивировано из оригинала 2 августа 2017 года . Получено 3 января 2016 года .
- ^ "Revision R286839" . svnweb.freebsd.org . FreeBSD . Получено 29 августа 2017 года .
- ^ «Питоны блокируются во время загрузки» . Получено 28 апреля 2017 года .
- ^ "Arc4random (3) страница OpenBSD Man" . OpenBSD Ручные страницы . OpenBSD . Получено 27 мая 2016 года .
Внешние ссылки
[ редактировать ]- Системный вызов для случайных чисел: getrandom () , lwn.net , 23 июля 2014 года, Джейк Эдж