Главная » Статьи » Программирование » С#

Простой генератор паролей на С#

Во время создания программы для хранения паролей, возможно, придется сделать генератор паролей. Данная статья предлагает простой генератор паролей, который создается на C#. Он не только должен быть способен сгенерировать секретное ключевое слово, но и проверить его сложность. Надежность пароля будем оценивать в терминах энтропийной битности, а пароль сгенерируем с помощью рекурсивной функции.

 

Генерирование секретного слова

 

Для получения пароля сгенерируем случайные числа через использование функции-генератора Next объекта типа Random. Нужно получить два случайных числа: первое — индекс массива, по которому будет располагаться наше следующее рандомное значение и собственно рандомное значение из диапазона от 0 до 127, которое также нужно привести к типу char с целью получения символа вместо числового значения.

 

Важно отсеять некоторые символы такие как «пробел», а оставить в нашем массиве только буквы, цифры, знаки пунктуации и разделительные символы. Поэтому обязательна проверка на данные символы, иначе будем генерировать числа, пока не получим требуемого значения. Получившееся значение помещаем в массив типа char по индексу, полученному в первом рандомном числе.

 

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

 

Каждая буква генерируется на одном из шагов рекурсии — уровень генерации. Этот уровень является управляющим для определения выхода из рекурсии. С каждым новым шагом значение уровня уменьшается и пока оно выше нуля генерация продолжается. Если же значение уровня становится равно нулю, то производится выход из рекурсии. Формирование массива происходит во время произведения генерации рандомных массивов. Ниже представлена искомая функция простого генератора пароля. Останется лишь преобразовать набор символов в строку, для чего можно воспользоваться функцией Concat<T>();

  1. public void Generator(ref char[] password, int len = 7, int level = 7)
  2. {
  3.          if (level > 0)
  4.          {
  5.            int index;
  6.            do
  7.            {
  8.                Random rand = new Random();
  9.                index = rand.Next(0, len);
  10.            }while(password[index] != ' ');
  11.  
  12.            char character;
  13.           do{
  14.               Random random = new Random();
  15.               byte dig = (byte)random.Next(0, 127);
  16.               character = (char)dig;
  17.               if((Char.IsLetterOrDigit(character) || Char.IsPunctuation(character) ||        Char.IsSeparator(character)) && !Char.IsWhiteSpace(character))
  18.                   {
  19.                           break;
  20.                   }
  21.            }while(true);
  22.                    password[index] = character;
  23.                    Generator(ref password, len, --level);
  24. }
  25. }

 

Сложность пароля

 

Мало получить секретное слово — надо подсчитать также его сложность. Подсчет осуществляем по энтропийной характеристике информации. Ее измеряют в битах. Грубо говоря, пароль с 54-битным уровнем сложности соответствует полученному случайным образом паролю длиной в 54 бита. Чтобы взломать такой пароль, хакеру потребуется испробовать 2⁵⁴ вариантов паролей. Поэтому добавление одного бита энтропийной характеристики удваивает сложность пароля.

 

Посчитать «битность» секретного слова можно по формуле:

N = Len log2 H;

Где N — вычисляемая «битность», Len — общее число символов пароля, а H — число применяемых разных символов.

Перед тем, как вычислить надежность пароля, нам потребуется сначала посчитать количество разных символов в секретном слове. Чем больше в пароле разных символов: большая и маленькая буквы, цифра, пунктуационный знак, разделитель — тем он надежней. Ниже приведем пример функции высчитывающей сложность пароля и возвращающей рассчитанное значение.

  1. public double StrengthPassword(char[] passarr, ref double differsymbols)
  2. {
  3.            double strength = 0;
  4.            foreach(char character in passarr)
  5.            {
  6.                if (Char.IsDigit(character) && digit)
  7.                {
  8.                  differsymbols++;
  9.                  this.digit = false;
  10.                }
  11.                if((Char.IsLetter(character) && Char.IsLower(character)) && lowletter)
  12.                {
  13.                 differsymbols++;
  14.                 this.lowletter = false;
  15.                }
  16.                if ((Char.IsLetter(character) && Char.IsUpper(character)) && upletter)
  17.                {
  18.                 differsymbols++;
  19.                 this.upletter = false;
  20.                }
  21.                if (Char.IsPunctuation(character) && punctuation)
  22.                {
  23.                 differsymbols++;
  24.                 this.punctuation = false;
  25.                }
  26.                if(Char.IsSeparator(character) && separator)
  27.                {
  28.                 differsymbols++;
  29.                 this.separator = false;
  30.                }
  31.            }
  32.           strength = Math.Floor(passarr.Length * Math.Log(differsymbols, 2));
  33.        
  34.    return strength;
  35. }

 

 

 

 

 



Ключевые слова: генератор паролей, сложность пароля, надежность пароля, биты энтропии
Категория: С# | Добавил: lesha (22.09.2015) | Автор: Иевенко Алексей W
Просмотров: 4099 | Комментарии: 3 | Теги: сложность пароля, Генератор паролей, надежность пароля, биты энтропии | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: