Генерация уникального случайного числа в ASP. NET Core - PullRequest
1 голос
/ 16 апреля 2020

Я работаю над сервисом Hotspot, используя ASP. NET Ядро, создающее приложение MVC, и мне нужно сгенерировать число 6-ди git (от 100000 до 999999), которое будет служить пароль для пользователя, чтобы подключиться и иметь inte rnet доступ. Это число должно быть уникальным в базе данных, и оно будет удалено через некоторое время (строка в месяц).

Каков наилучший способ создания этого уникального номера? Я использую Entity Framework, и мне было интересно, может ли это как-то помочь мне с этой проблемой ...

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 16 апреля 2020

Что ж, достаточно просто сделать что-то вроде:

var rand = new Random();
var uid = rand.Next(100000, 1000000);

Однако, единственный способ обеспечить уникальность в базе данных - это 1) запрос, чтобы убедиться, что значение не существует первым ( хотя там есть проблемы с параллелизмом) или 2) сделать столбец уникальным и отлавливать исключения БД, полученные из проверок ограничений.

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

Стоит отметить, что, как указывает @PeterO, это не будет удаленно безопасно. Было бы тривиально легко вызвать грубое столкновение из пула, насчитывающего менее миллиона кандидатов. Тем не менее, использование криптографии c RNG здесь не поможет, если вы все равно получите шестизначную цифру c. Как вы получаете случайное число, не так важно, как то, насколько случайным может быть это число. Энтропия здесь близка к нулю.

1 голос
/ 16 апреля 2020

Из-за рандомизации, основанной на времени, вы не можете быть уверены, что число будет уникальным. Если под уникальным вы подразумеваете, что он должен быть уникальным в базе данных, вы можете извлечь все пароли из базы данных и сгенерировать случайное число (new Random().Next(100000, 1000000)) и генерировать его снова, пока не найдете совпадение. Но я бы не советовал использовать пароль 'basi c' даже на короткий период времени.

0 голосов
/ 16 апреля 2020

Для генерации самого пароля вы должны использовать криптографию c RNG (например, RNGCryptoServiceProvider in. NET); см. мой раздел существующих API для различных языков программирования . Использование System.Random здесь неуместно, так как случайный пароль предназначен для аутентификации, а System.Random не предназначен для безопасности.

Однако есть несколько проблем с подходом, который вы используете.

Является ли пароль единственным, что предоставляет доступ? Требуется ли также имя пользователя или тому подобное для предоставления доступа?

Наличие пароля 6-ди git допускает только 900 000 возможностей, что делает его уязвимым для атак с использованием подбора. Из-за проблемы дня рождения , чуть больше квадрата root из 900 000 догадок (чуть больше 950) достаточно, чтобы ввести действительный пароль, и вероятность того, что пароль будет действительным, возрастает по мере увеличения пароли есть в базе данных.

Рассматривали ли вы необходимость в более длинном пароле или другом способе аутентификации пользователей вашей точки доступа?

Рассматривали ли вы протоколы одноразовых паролей?

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

...