Плюсы и минусы RNGCryptoServiceProvider

Каковы плюсы и минусы использования System.Security.Cryptography.RNGCryptoServiceProvider по сравнению с System.Random. Я знаю, что RNGCryptoServiceProvider более случайный, т.е. менее предсказуемый для хакеров. Есть ли другие плюсы или минусы?


Обновлено:

Согласно ответам, вот плюсы и минусы использования RNGCryptoServiceProvider на данный момент:

Плюсы

  • RNGCryptoServiceProvider - более сильное криптографически случайное число, что означает, что его лучше использовать для определения ключей шифрования и т.п.

Минусы

  • Random быстрее, потому что это более простой расчет; при использовании в симуляциях или длительных вычислениях, где криптографическая случайность не важна, это следует использовать. Примечание: см. Ответ Кевина для получения подробной информации о моделировании - Random не обязательно достаточно случайный, и вы можете захотеть использовать другой не криптографический PRNG.
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
72
0
25 855
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Криптографически стойкий ГСЧ будет медленнее - для этого потребуется больше вычислений - и будет спектрально белым, но он не будет так хорошо подходить для моделирования или методов Монте-Карло, потому что они делать занимают больше времени, и потому что они могут не будет повторяться, что приятно для тестирования.

В общем, вы хотите использовать криптографический PRNG, когда вам нужен уникальный номер, такой как UUID, или в качестве ключа для шифрования, и детерминированный PRNG для скорости и моделирования.

например Блюм Блюм Шуб vs Мерсенн Твистер. BBS создается с учетом надежных криптографических доказательств, и для того, чтобы получить хоть какое-то значение, близкое к случайному для не криптографических целей, это слишком медленно и ресурсоемко.

Calyth 07.01.2009 04:17

При повторном тестировании вы всегда можете использовать Random во время тестирования и изменить реализацию, чтобы использовать RNGCryptoServiceProvider в производстве, не так ли?

configurator 08.01.2009 04:26

Можно, но сильный ГПСЧ все равно не подходит для некоторых целей, таких как Монте-Карло; повторяемость и скорость также желательны при производственном использовании.

Charlie Martin 08.01.2009 06:55

Что вы имеете в виду под «спектрально-белым»?

Robert MacLean 28.05.2013 14:04

Как белый шум. Спектр мощности плоский, и нет более вероятных групп чисел, чем другие. См. en.wikipedia.org/wiki/White_noise и en.wikipedia.org/wiki/Power_spectral_de density По сути, это сильный тест для действительно случайных чисел.

Charlie Martin 29.05.2013 17:36

@CharlieMartin "Спектр мощности плоский, и нет более вероятных групп чисел". Разве тот факт, что спектр плоский, не означает, что некоторые группы чисел находятся с большей вероятностью появятся? В RNGCryptoServiceProvider каждый бит имеет примерно 50% шанс быть установленным, это означает, что числа с примерно половиной их установленных битов будут самыми популярными, а числа с установленным только несколькими битами (или значениями со всеми установленными битами) будут маловероятно.

josh poley 08.09.2015 23:42

Ох, хороший вопрос. Учтите: 001100 имеет такое же количество битов, как и 110000. И посмотрите это: en.wikipedia.org/wiki/Statistical_randomness

Charlie Martin 08.09.2015 23:53

Да, есть еще один. Как писал Чарли Мартин, System.Random быстрее.

Хочу добавить следующую информацию:

RNGCryptoServiceProvider - это стандартная реализация генератора случайных чисел, совместимого со стандартами безопасности. Если вам нужна случайная переменная в целях безопасности, вы должны использовать этот класс или его эквивалент, но не используйте System.Random, потому что он очень предсказуем.

Для всех других целей приветствуется более высокая производительность System.Random и аналогичных классов.

Могу ли я использовать rngcryptoserviceprovider в качестве токена аутентификации для webapi, используемого различными приложениями.

Dragon 30.03.2017 19:44

System.Random не является потокобезопасным.

Хорошая точка зрения. Вы можете увидеть blogs.msdn.com/pfxteam/archive/2009/02/19/9434171.aspx для дальнейшего обсуждения.

configurator 03.02.2010 04:51

Теперь, когда я думаю об этом, RNGCryptoServiceProvider тоже не такой!

configurator 03.02.2010 04:52

MSDN, похоже, говорит, что RNGCryptoServiceProvider является потокобезопасным (msdn.microsoft.com/en-us/library/…).

Scott Lawrence 17.06.2010 23:55

Помимо шуток, он может испортить себя и вернуть нули (stackoverflow.com/a/11109361/155892). (dilbert.com/strips/comic/2001-10-25)

Mark Sowul 08.05.2013 19:09

В дополнение к предыдущим ответам:

System.Random следует использовать в моделировании или численных решателях для науки и техники, где есть существенные негативные последствия неточных результатов моделирования или сбоя сходимости. Это связано с тем, что реализация Microsoft - глубоко ошибочный в нескольких отношениях, и они не могут (или не будут) легко исправить это из-за проблем совместимости. См. эта почта.

Так:

  • Если есть противник, который не должен знать сгенерированную последовательность, затем используйте RNGCryptoServiceProvider или другой тщательно разработанный, реализованный и проверенный криптографически стойкий RNG, а в идеале используйте аппаратную случайность, где это возможно. Иначе;

  • Если это приложение, такое как моделирование, которое требует хороших статистических свойств, затем используйте тщательно разработанный и реализованный некриптографический PRNG, такой как Мерсенн Твистер. (В этих случаях криптографический ГСЧ также будет верный, но часто слишком медленным и громоздким.) Иначе;

  • ТОЛЬКО, если использование чисел совершенно тривиально, например, решение, какое изображение показывать следующим в случайном слайд-шоу, затем использовать System.Random.


Недавно я очень ощутимо столкнулся с этой проблемой, когда работал над симуляцией Монте-Карло, предназначенной для проверки эффектов различных схем использования медицинских устройств. Моделирование дало результаты, которые находятся в пределах противоположное направление, которые можно было бы разумно ожидать.

Sometimes when you canʼt explain something, thereʼs a reason behind it, and that reason could be very onerous!

Вот график значений п ‑, которые были получены в увеличивающемся количестве пакетов моделирования:

Input & output _p_‑values while using <code>System.Random</code>

Красный и пурпурный графики показывают статистическую значимость различий между двумя моделями использования в двух исследуемых выходных показателях.

Голубой график представляет собой особенно шокирующий результат, потому что он представляет значения п ‑ для характеристики случайного Вход для моделирования. (Это было нанесено на график только для подтверждения того, что входные данные не были ошибочными.) Входные данные, конечно, были изначально одинаковыми для двух исследуемых моделей использования, поэтому не должно быть статистически значимой разницы между Вход для этих двух моделей. . И все же здесь я видел более чем 99.97% уверенность, что есть было такая разница !!

Сначала я подумал, что в моем коде что-то не так, но все проверило. (В частности, я подтвердил, что потоки не совместно используют экземпляры System.Random.) Когда повторное тестирование показало, что этот неожиданный результат очень согласован, я начал подозревать System.Random.

Я заменил System.Random реализацией Mersenne Twister - никаких других изменений - и сразу же результат стал кардинально другим, как показано здесь:

Input & output _p_‑values after switching to a better PRNG

Эта диаграмма отражает отсутствие статистически значимой разницы между двумя моделями использования параметров, используемых в этом конкретном наборе тестов. Это был ожидаемый результат.

Обратите внимание, что на первой диаграмме вертикальная логарифмическая шкала (по значению п ‑) охватывает семь десятилетий, тогда как во второй есть только одна декада, демонстрируя, насколько выражена статистическая значимость ложных расхождений! (Вертикальная шкала указывает вероятность того, что расхождения могли возникнуть случайно.)

Я подозреваю, что происходило то, что System.Random имеет некоторые корреляции в течение некоторого довольно короткого цикла генератора, и разные шаблоны внутренней выборки случайности между двумя тестируемыми моделями (которые имели существенно разное количество обращений к Random.Next) привели к тому, что это повлияло на две модели в различные способы.

Так получилось, что моделирование Вход основано на тех же потоках ГСЧ, которые используются в моделях для внутренних решений, и это, очевидно, привело к тому, что эти несоответствия выборки повлияли на входные данные. (На самом деле это было удачей, потому что в противном случае я, возможно, не понял бы, что неожиданный результат был ошибкой программного обеспечения, а не каким-то реальным свойством моделируемых устройств!)

Интересно. Я не знал о статистических различиях. Спасибо!

configurator 26.02.2019 16:27

Другие вопросы по теме