Как работает этот код случайного пароля C # asp.net? - PullRequest
1 голос
/ 11 мая 2010

Я новичок в .NET и C #, и я пытаюсь выяснить, как работает этот код:

public static string CreateRandomPassword(int PasswordLength)
{
  String _allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ23456789";
  Byte[] randomBytes = new Byte[PasswordLength];
  RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
  rng.GetBytes(randomBytes);
  char[] chars = new char[PasswordLength];
  int allowedCharCount = _allowedChars.Length;

  for(int i = 0;i<PasswordLength;i++)
  {
      ///
      /// I don't understand how this line works:
      ///
      chars[i] = _allowedChars[(int)randomBytes[i] % allowedCharCount];
  }

  return new string(chars);
}

Я думаю, что у меня есть довольно хорошая справка по большей части этого.Я не смог понять следующую строку:

chars[i] = _allowedChars[(int)randomBytes[i] % allowedCharCount];

Я понимаю, что код генерирует случайные двоичные числа и использует эти случайные числа в цикле for, чтобы выбрать символ из строки _allowedChars.Чего я не понимаю, так это того, почему этот код использует модульный оператор (%) для получения значения индекса _allowedChars.

Спасибо за любую помощь

Ответы [ 6 ]

5 голосов
/ 11 мая 2010

Это только примечание, но этот код слегка нарушен. Оператор модуля (%), используемый для выбора того, какой символ выбрать, является неоднородным: некоторые символы (те, что расположены ближе к началу массива) предпочтительнее других, что означает, что пароль не является действительно случайным Злоумышленник может использовать это, чтобы сначала использовать пароли с более высокой вероятностью и значительно сократить время, необходимое для взлома.

3 голосов
/ 11 мая 2010

Значением randomBytes [i] может быть любое целое число от 0 до 255. Длина массива _allowedChars меньше 255. Оператор modules возвращает остаток от деления первого аргумента ((int) randomBytes [i]) по второму аргументу (позволилCharCount). Это гарантирует, что значение, которое мы индексируем массив _allowedChars (результат оператора по модулю), всегда меньше, чем allowCharacterCount.

0 голосов
/ 19 декабря 2010
2%5=3
4%5=1
6%5=1
15%5=0
16%5=1

Это гарантирует любой результат между 0-5.
Если вы замените 5 на любое другое число ( n ), у вас будет аналогичная гарантия того, что результат будет между 0- n .

0 голосов
/ 11 мая 2010

Использование мода гарантирует, что число находится в диапазоне от 0 до allowedCharCount - это предотвращает исключение индекса из диапазона. Без этого вам пришлось бы ограничить диапазон случайно сгенерированных чисел, что невозможно с криптографическим провайдером. Это также означает, что вы можете изменить список разрешенных символов в строке без прерывания кода.

0 голосов
/ 11 мая 2010

Вы работаете по модулю allowedCharCount, это гарантирует, что сгенерированное число находится в диапазоне от 0 до allowedCharCount, поэтому исключение IndexOutOfRange не выдается.

0 голосов
/ 11 мая 2010

Он использует оператор модуля, потому что randomBytes[i] может содержать значение, превышающее длину массива _allowedChars.

Использование % allowedCharCount гарантирует, что индекс в _allowedChars всегда находится в пределах диапазона. В противном случае код мог бы вызвать исключение в этой строке.

...