Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745

Проверка пароля на соответствие требованиям

19.03.2018, 08:42. Показов 3425. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня, господа форумчане. Возникла необходимость проверки пароля на соответствие требованиям информационной безопасности. А именно:
1. Установлена периодичность смены пароля в 90 дней;
2. Пароль должен быть длинной не менее восьми символов;
3. Пароль должен содержать хотя-бы одну заглавную букву;
4. Пароль должен содержать хотя-бы одну цифру;
5. Пароль должен содержать хотя-бы один спецсимвол: !, @, #, $, %, ^, :, &, *, (, ), -, +, _
С первыми двумя пунктами все понятно, но вот с другими тупняк. Я накидал функцию:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function TMainF.CheckPass(s :String; tag :Integer):Boolean;
var
lazha   :Boolean;
i       :Word;
begin
lazha:=false;
case tag of
0:
begin
for I := 1 to Length(S) do
  if (s[i] in ['А'..'Я', 'Ё', 'A'..'Z']) Then
  Begin
  lazha:=False;
  Break
  End
  else
  lazha:=True;
end;//0
1:
begin
 for I := 1 to Length(S) do
  if (s[i] in ['0'..'9'])Then
  Begin
  lazha:=False;
  Break
  End
  else
  lazha:=True;
end;//1
2:
begin
 for I := 1 to Length(S) do
  if (s[i] in ['!','@', '#', '$', '%', '^', ':', '&', '*', '(', ')', '-', '+','_']) Then
  Begin
  lazha:=False;
  Break
  End
  else
  lazha:=True;
end;//2
end;//case
Result:=lazha;
end;
и соответственно вызываю ее
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
w,n,s :Boolean;
st    :String;
begin
st:='Пароль не отвечает требованиям информационной безопасности!' +#10#13+
                         'Пароль должен быть не менее 8 символов, ' +#10#13+
                         'содержать заглавные буквы, ' +#10#13+
                         'цифры от 0 до 9, '+#10#13+
                         'а так же спецсимволы: !, @, #, $, %, ^, :, &, *, (, ), -, +, _';
if Length(Trim(pass1.Text))<8 then
  raise Exception.Create(st);
w:=MainF.CheckPass(Pass1.Text,0);//на наличие заглавных букв
n:=MainF.CheckPass(Pass1.Text,1);//наличие цифр
s:=MainF.CheckPass(Pass1.Text,2);//наличие спецсимволов
if (w) or (n) or (s) then
  raise Exception.Create(st);
end;
Приходится вызывать её трижды. Чую пятой точкой, что есть способ практичнее, но вот допереть не могу.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.03.2018, 08:42
Ответы с готовыми решениями:

Как проверить пароль на соответствие требованиям при регистрации?
Создал БД на MS SQL Server 2012 с таблицей &quot;users&quot; и тремя полями: id, login и password. Также создал форму на Visual Studio 2017, где...

ASUS K55V Характеристика ноутбука и соответствие требованиям игр
Характеристика:Asus k55v,Intel core i7,Nvidia Geforce GT 635M.2gb.Пойдет ли при таких характеристиках вот эти игры: Battlefield...

Как написать запрос на соответствие введенных логина и пароля с хранящимися в БД?
Есть у меня таблица Users с тремя столбцами: Login, Password, Position(должность). Как должен выглядеть запрос на проверку введенных...

18
5953 / 4529 / 1094
Регистрация: 29.08.2013
Сообщений: 28,121
Записей в блоге: 3
19.03.2018, 11:49
Цитата Сообщение от drvolodko Посмотреть сообщение
С первыми двумя пунктами все понятно, но вот с другими тупняк. Я накидал функцию:
то есть как найти в тексте заглавную букву ты понял, а как найти любую цифру -нет?
очень странно

5 - составь массив из символов и проверяй их наличие

Цитата Сообщение от drvolodko Посмотреть сообщение
Приходится вызывать её трижды. Чую пятой точкой, что есть способ практичнее, но вот допереть не могу.
напиши другую функцию которая будет вызывать твою сколько нужно раз
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
19.03.2018, 12:03
Цитата Сообщение от drvolodko Посмотреть сообщение
С первыми двумя пунктами все понятно
Цитата Сообщение от drvolodko Посмотреть сообщение
1. Установлена периодичность смены пароля в 90 дней;
Вам и с этим пунктом понятно? Мне вот не совсем... Как и где Вы собираетесь это делать...
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
19.03.2018, 12:19  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Вам и с этим пунктом понятно? Мне вот не совсем... Как и где Вы собираетесь это делать..
В таблицу добавил поле с датой. После аутентификации пользователя идет проверка даты. Если меньше или равна текущей - меняем пароль.
Цитата Сообщение от qwertehok Посмотреть сообщение
то есть как найти в тексте заглавную букву ты понял, а как найти любую цифру -нет?
Все у меня ищет. И буквы, и цифры, и символы. Код же привел.
Delphi
1
2
3
if (s[i] in ['А'..'Я', 'Ё', 'A'..'Z'])
if (s[i] in ['0'..'9']) Then
if (s[i] in ['!','@', '#', '$', '%', '^', ':', '&', '*', '(', ')', '-', '+','_']) Then
Вопрос был в исследовании возможности упрощения функции. Мне вот ничего другого в голову не пришло. Поэтому и спрашиваю, может у кого есть идеи получше моей...
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
19.03.2018, 12:50
Лучший ответ Сообщение было отмечено drvolodko как решение

Решение

Цитата Сообщение от drvolodko Посмотреть сообщение
возможности упрощения функции
Вот так можно...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function CheckPsw(_text: String): boolean;
var i, Summ: integer;
    A: array [1..5] of integer;
begin
 for i := 1 to 5 do
  A[i] := 0;
 if Length(_text) >= 8 then A[1] := 1;
 for i := 1 to Length(_text) do
  begin
   if (_text[i] in ['а'..'я', 'ё', 'a'..'z']) then A[2] := 1;
   if (_text[i] in ['А'..'Я', 'Ё', 'A'..'Z']) then A[3] := 1;
   if (_text[i] in ['0'..'9']) then A[4] := 1;
   if (_text[i] in ['!','@', '#', '$', '%', '^', ':', '&', '*', '(', ')', '-', '+','_']) then A[5] := 1;
  end;
 Summ := 0;
 for i := 1 to 5 do
  Summ := Summ + A[i];
 result := Summ = 5;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 if CheckPsw(Edit1.Text) then ShowMessage('y') else ShowMessage('no');
end;
Добавлено через 1 минуту
Но учтите, что на новых юникодных версиях это работать не будет/будет, но с косяками...
1
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
19.03.2018, 14:10  [ТС]
D1973, спасибо. Так получше будет.
0
5953 / 4529 / 1094
Регистрация: 29.08.2013
Сообщений: 28,121
Записей в блоге: 3
19.03.2018, 14:35
Цитата Сообщение от drvolodko Посмотреть сообщение
Все у меня ищет.
Цитата Сообщение от drvolodko Посмотреть сообщение
С первыми двумя пунктами все понятно, но вот с другими тупняк
не понятно

Цитата Сообщение от D1973 Посмотреть сообщение
if (_text[i] in ['а'..'я', 'ё', 'a'..'z']) then A[2] := 1;
есть же CharInSet()
да и массив лишний
1
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
19.03.2018, 14:38  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
есть же CharInSet()
Я пробовал с ним. У меня ошибку выдает. Delphi XE5.
Delphi
1
if CharInSet(s,['A'..'Z']) then lazha:=False;
[dcc32 Error] MainForm.pas(115): E2250 There is no overloaded version of 'CharInSet' that can be called with these arguments
0
5953 / 4529 / 1094
Регистрация: 29.08.2013
Сообщений: 28,121
Записей в блоге: 3
19.03.2018, 14:44
CharInSet - не работает фрагмент кода

не ленимся, все что мы хотим уже кто то делал
1
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
19.03.2018, 14:50  [ТС]
qwertehok, ну и в итоге ТС не стал использовать charInSet, так как у него тоже не работает он. Но и там тоже идея вроде как хорошая. Попробую тоже.
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
19.03.2018, 15:42
Цитата Сообщение от qwertehok Посмотреть сообщение
есть же CharInSet()
Вот в юникодных версиях, где он есть, я предпочитаю вообще с типом Char не связываться...
Цитата Сообщение от qwertehok Посмотреть сообщение
массив лишний
Точно
Цитата Сообщение от drvolodko Посмотреть сообщение
Delphi XE5.
Вот с этого всегда и надо начинать - указывать свою версию Delphi. Это делается при создании темы и избавляет от многих непоняток...

Вот так работает и в юникодныых версиях:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function CheckPsw(_text: String): boolean;
const aBig: String = 'ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
      aSmall: String = 'abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя';
      Digit: String = '0123456789';
      Symb: String = '~!@#$%^&*()-_=+';
var i: integer;
    Mask: String;
begin
 Mask := '00000';
 if Length(_text) >= 8 then Mask[1] := '1';
 for i := 1 to Length(_text) do
  begin
   if Pos(_text[i], aBig) > 0 then Mask[2] := '1';
   if Pos(_text[i], aSmall) > 0 then Mask[3] := '1';
   if Pos(_text[i], Digit) > 0 then Mask[4] := '1';
   if Pos(_text[i], Symb) > 0 then Mask[5] := '1';
  end;
 result := Mask = '11111';
end;
1
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
19.03.2018, 16:03  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
указывать свою версию Delphi.
Буду знать Спасибо. D1973, а AnsiPos вместо Pos в данном случае можно использовать?
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
19.03.2018, 16:19
Цитата Сообщение от drvolodko Посмотреть сообщение
а AnsiPos вместо Pos в данном случае можно использовать?
А смысл?
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
19.03.2018, 16:26  [ТС]
D1973, понял. спасибо за ответы
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
19.03.2018, 18:08
Небольшой забавный факт. Пароли записанные с этими требованиями запоминаются и подбираются человеком плохо, а вот для компьютера такой подбор не сложен. Намного сложнее подобрать пароль содержащий просто несколько слов с небольшим добавлением от себя, например:
саша саше моет ротик
Даже просто первые три буквы из каждого слова забавной фразы будут намного устойчивее к взлому, чем этот изврат.
сашсашмоерот
такую фразу и запомнить намного легче
0
 Аватар для drvolodko
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
20.03.2018, 06:44  [ТС]
Пытливый, я это понимаю, но:
1. Как это объяснить господам из СКЗ? У них регламент.
2. Пользователи 100% не будут заморачиваться с паролями в виде фраз и словосочетаний. Введут 1234 и все.
Тем более я пароль в базе не храню. Перед записью в табличку я его шифрую и записываю уже результат шифрования.
0
20.03.2018, 07:52

Не по теме:

Цитата Сообщение от Пытливый Посмотреть сообщение
Небольшой забавный факт
Просто наболело...
К сожалению, личный опыт показывает, что логика, нормальное, с нашей точки зрения, положение вещей, просто жизненный опыт с одной стороны и инструкции по ИБ с другой - это понятия абсолютно несовместимые...
Первый постулат: пароль/парольная фраза не должны являться каким-либо осмысленным словом/словосочетанием! (как ты будешь эту чертовщину запоминать - твои проблемы)
Второй постулат: пароль ни в коем случае нельзя записывать где бы то ни было (ага, найдет кто-то в моем ящике стола тетрадку, исписанную всякой всячиной, и начнет всю эту ахинею испытывать, как пароль куда-то там... Ну-ну, м.б. до пенсии и управится)
Третий постулат: пароль должен содержать... Ну далее уже по вышеозвученному. Добавлю только, что особо параноидальные личности выдвигают совсем уж [правила форума п. 5.2] требования: длина не менее 12 символов, использование не просто заглавных и строчных символов, но и на разных языках... т.е. пароль должен выглядеть примерно так 1@AbcЁпр%5жt.
Четвертый постулат: пароль не должен повторять последние 10 паролей с точностью до 2-х знаков...
Я уж молчу про разделение паролей на несколько частей, каждую из которых знает только один админ (есть, правда, конверт, с резервной копией, который требуется менять после каждой смены пароля). Так вот это цирк, когда дежурный ночью вызывает всю "святую троицу" потому, что требуется этот сервер перезагрузить!
И вот всю эту муть приходится выполнять!!!
Вот такой вот "забавный" факт

0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
20.03.2018, 21:09
разделение паролей на несколько частей, каждую из которых знает только один админ
это уже полный маразм. Мы живем в реальном мире с живыми людьми, а живые люди имеют обязательное свойство нарушать правила, в отличии от механизмов. Рано или поздно но это случится обязательно, кого-то не найдут, он забудет пароль или попадет в аварию, просто пошлет на 3 буквы и т.д. И тогда произойдет с вероятностью 99% одно из двух, внезапно окажется, что пароль то можно достать и другим путем, например из сейфа руководителя, на которого эти правила не распространяются или озверевший админ в 4 утра примет волевое решение снести к хренам все и настроить все заново "по человечески"
0
21.03.2018, 05:51

Не по теме:

Цитата Сообщение от Пытливый Посмотреть сообщение
это уже полный маразм
Эт точно...
Цитата Сообщение от Пытливый Посмотреть сообщение
озверевший админ в 4 утра
Это как раз я и второй админ. А вот третий (он же Администратор Информационной Безопасности, он же Главнюк) с мордой каменного будды просто заявляет "Так положено!" И - все собственно...
С прежним АИБ-ом проблем таких вообще не было. Разделили пароль, но каждый, кому положено его знать - его знал и ночные вылазки просто делили: в эту декаду ты, следующую я, потом он... Но нормальные люди, с которыми можно как-то все устроить по человечески, на такой собачьей должности долго не задерживаются

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.03.2018, 05:51
Помогаю со студенческими работами здесь

Проверка на соответствие
Добрый день. Требуется проверить: 1) Чтобы была хотя бы одна буква (рус / анг - неважно) 2) Что в строке только буквы (язык неважен),...

Проверка на соответствие
Необходимо сделать проверку на соответствие маски фразы, маска вида asd*фывд? где * - любое количество любых символов, а ? - любой один...

Проверка на соответствие скобок
1. Требуется определить соответствие открывающихся и закрывающихся скобок в строке, используя алгоритм поиска в ширину - вывести на экран...

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

Сортировка и проверка на соответствие
Есть 2 списка каждый содержит два столбца наименование и кол-во; причем наименования расположены в разном порядке. Необходимо сопоставить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru