RSS

Свой генератор паролей (случайных символов) на Delphi

При разработке нового проекта мне потребовалось создать функцию, которая по заданным критериям генерирует строку определенной длины со случайным набором символов. Это было необходимо для организации хранения файлов на удаленном сервере с уникальными именами, уникальным ключом, записанным в базе данных для получения доступа к этому файлу. Так же, добавление функциональности получения ключа доступа при регистрации в программе (для избавления пользователя придумывать свой пароль) и отправки кода подтверждения электронного адреса пользователю на указанный им Email. Некая проверка владения адресом. Все эти задачи выполняет одна единственная функция, которой я дал название RandString.

 

Этой функцией, обернутой в удобный интерфейс, я с вами и поделюсь. Вы же можете использовать полученную в итоге программу для генерации паролей, например к соц. сетям или форумам, тем самым избавив себя от постоянной головоломки придумывания сложных паролей, либо в других целях. Алгоритм функции очень прост и легок в понимании, ее можно легко переписать на другой язык которым Вы владеете, например php или js, тем самым дополнить функциональность своего сайта. В общем, приступим!

 

Открываем нашу, вечно живую, среду Delphi. Для написания примера я буду использовать Delphi 7, Вы же можете использовать более новую версию, пример работает в любой среде. Создаем новый проект с формой и размещаем на форме следующие компоненты: 4-е CheckBox’а, одну кнопку Button, один Edit, один Label и один SpinEdit (ввод чисел).

 
Имена компонентам оставлю по умолчанию, но Вы можете их обозвать, только в дальнейшем не запутайтесь. А вот свойства Caption изменим, для понимания пользователем всех переключаетелей:
CheckBox1 – «Символы в нижнем регистре»;
CheckBox2 – «Символы в верхнем регистре»;
— CheckBox3 – «Числа»;
— CheckBox4 – «Спец. символы»;
Button1 – «Генератор»;
Label1 – «Длина строки».
 

Edit1 – свойство Text сделаем пустым, а у компонента SpinEdit1 свойство Value поставим равным 20 (кол-во символов в генерируемой строке по умолчанию). Так же, ограничим диапазоны минимального значения MinValue = 2 и MaxValue = 100 т.е. наша строка должна быть не меньше 2 символов и не больше 100.

 
CheckBox’ы – логические переключатели, будут сигнализировать нашей функции RandString, символы какого типа включать в генерируемую строку.
SpinEdit1 — как Вы наверно догадались, задает длину генерируемой строки.
Ну а Edit1 принимает результат.
 
Расположите все компоненты на форме приблизительно как на рисунке ниже или по своему усмотрению.
  ScreenShot_22.09.2015_9:14:13
Ну все, подготовительные этапы завершены, переходим к самому интересному, к написанию кода.
 
В модуле, ниже ключевого слова implementation пишем следующий код функции:

function Randstring(Len:word; LCase, UpCase, Digit, SpecSymb:boolean):string;
 const symLCase=‘abcdefghijklmnopqrstuvwxyz’//набор символов в нижнем регистре
       symUCase=‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’//набор символов в верхнем регистре
       symNum =‘0123456789’//набор цифр 
       symSpecSymb = ‘[]{},.»;:-+#’//набор спец. символов

var name,symb:string;
    i:word;

begin

//создаем общий набор symb в соответствии с отмеченными параметрами функции LCase, UpCase, Digit, SpecSymb
 if LCase then symb:=symb+symLCase; //Включаем в набор символы нижнего регистра
 if UpCase then symb:=symb+symUCase; //Включаем в набор символы верхнего регистра
 if Digit then symb:=symb+symNum; //Включаем в набор цифры
 if SpecSymb then symb:=symb+symSpecSymb; //Включаем в набор спец. символы

 if symb=» then symb:=symLCase; //проверяем, если набор остался пустым, то по умолчанию включаем символы нижнего регистра

   name:=»;
     for i := 1 to Len do
          //генерируем случайные символы из набора symb
          //цикл повторяется указанное в параметре Len раз
          //функция random возвращает целое число от 0 до размера набора symb
          name:=name+symb[random(length(symb))+1];

   Result:=Name; //выводит результат
end;

Практически каждую строку кода я прокомментировал. Вкратце логика такая:

  1. Заполняем наборы символов, это константы – symLCase, symUCase, symNum, symSpecSymb;
  2. Далее, в соответствии с входными логическими параметрами, создаем одну большую строку-набор символов, из которой и будем в дальнейшем случайным образом вытягивать символы по индексу. Если, не один из параметров не указан, то по умолчанию берем набор symLCase – строка в нижнем регистре.
  3. Теперь в цикле for, строим случайную строку. Т.е. используя функцию Random, которая возвращает случайное целое число от 0 до указанного диапазона, в нашем случае диапазон это длина всего  набора символов, из которого выбираются символы. Число, которое вернет функция Random, это не что иное, как индекс символа в созданном наборе символов. Вспоминаем, что строка это, одномерный массив и обращаясь к символу в наборе symb [индекс], мы получаем случайный символ, который прибавляем к новой строке name.
  4. Ну и последнее, это возвращаем результат работы функции.

 
Чуть не забыл, цикл For будет повторяться столько раз, сколько указано во входном параметре функции Len (длина строки).
 

В принципе, это и все! Осталось только ее вызвать и результат передать пользователю. Для этого кликнем по кнопке Генератор два раза, чтобы создать событие Click, и добавим следующий код:

Edit1.Text:=RandString(SpinEdit1.Value, CheckBox1.Checked, CheckBox2.Checked, CheckBox3.Checked, CheckBox4.Checked);
 
Для тех, у кого возникли проблемы, привожу полный код модуля:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Randstring(Len:word; LCase, UpCase, Digit, SpecSymb:boolean):string;
 const symLCase=‘abcdefghijklmnopqrstuvwxyz’//набор символов в нижнем регистре
       symUCase=‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’//набор символов в верхнем регистре
       symNum =‘0123456789’//набор цифр 
       symSpecSymb = ‘[]{},.»;:-+#’//набор спец. символов

var name,symb:string;
    i:word;

begin

//создаем общий набор symb в соответствии с отмеченными параметрами функции LCase, UpCase, Digit, SpecSymb
 if LCase then symb:=symb+symLCase; //Включаем в набор символы нижнего регистра
 if UpCase then symb:=symb+symUCase; //Включаем в набор символы верхнего регистра
 if Digit then symb:=symb+symNum; //Включаем в набор цифры
 if SpecSymb then symb:=symb+symSpecSymb; //Включаем в набор спец. символы

 if symb=» then symb:=symLCase; //проверяем, если набор остался пустым, то по умолчанию включаем символы нижнего регистра

   name:=»;
     for i := 1 to Len do
          //генерируем случайные символы из набора symb
          //цикл повторяется указанное в параметре Len раз
          //функция random возвращает целое число от 0 до размера набора symb
          name:=name+symb[random(length(symb))+1];

   Result:=Name; //выводит результат
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//задаем параметры функции Randstring и выводит результат в Edit1
Edit1.Text:=Randstring(SpinEdit1.Value,//длина генерируемой строки
                       CheckBox1.Checked,//если отмечен флажком, то включаем в набор символы нижнего регистра
                       CheckBox2.Checked,//если отмечен флажком, то включаем в набор символы верхнего регистра
                       CheckBox3.Checked,//если отмечен флажком, то включаем в набор цифры
                       CheckBox4.Checked); //если отмечен флажком, то включаем в набор спец. символы
end;

end.

На этом все! Компилируем и пробуем.
 
Скачать полный пример Вы можете отсюда.