Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.07.2014, 09:32
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию Реализация авторизации в приложении

Ребят, помогите пожалуйста статейкой или книжкой где адекватно даётся мат.часть по авторизации пользователей в программе с использованием (хранением учётных записей) БД. Говно-код, вроде того, что проверяет данные в InputBox на этапе инициализации Application не предлагать

Общая идея, я так понял, выглядит так:
Код:
MainForm.OnCreate
 with TFormLogin.Create(self) do
   try
   if вызов метода Auth, который возвращает true\false при авторизации then
      не знаю что тут писать. По идее ничего, просто пропустить к методу Free; 
   else
      а если авторизация не прошла как адекватно пропустить к методу Free, и при этом закрыть MainForm?
   finally
      Free;
   end;
Сам метод Auth:
Код:
Result := false;
  While not Result do
     if ShowModal = mrOK
           if возможно связаться с удалённой БД then
              if данные совпадают then
                Result := True
              else 
                по идее нужно добавить какой-то счётчик на количество попыток


Возникают следующие вопросы:
а если к БД не будет доступа, что тогда? Пользователь не сможет работать с программой?)
В каком виде хранить пароли в БД? Cash какого-нибудь RSA(пароль) и сравнивать тогда уже только хеши?

Последний раз редактировалось Uniq!, 17.07.2014 в 09:51.
Ответить с цитированием
  #2  
Старый 17.07.2014, 10:05
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Uniq!
а если к БД не будет доступа, что тогда? Пользователь не сможет работать с программой?)
Такая тема уже была, и я даже в ней ответил.

Цитата:
Сообщение от Uniq!
В каком виде хранить пароли в БД? Cash какого-нибудь RSA(пароль) и сравнивать тогда уже только хеши?
Да, так обычно и делают MD5 уже не советуют, сейчас надежным считается SHA256.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #3  
Старый 17.07.2014, 13:04
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от Freeman
SHA256

Я правильно понимаю, что можно воспользоваться APIшными функциями самой винды, чтоб создать Хеш?
Ответить с цитированием
  #4  
Старый 17.07.2014, 17:47
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

А есть такие? В исходниках Indy вроде самопал какой-то.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #5  
Старый 18.07.2014, 12:50
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от Freeman
А есть такие? В исходниках Indy вроде самопал какой-то.
Инди упал при вызове функции SHA1.

Вот MSDN-ссылка
Ну и статья по теме: Delphi и Windows API для защиты секретов
Ответить с цитированием
Этот пользователь сказал Спасибо Uniq! за это полезное сообщение:
Freeman (18.07.2014)
  #6  
Старый 18.07.2014, 13:46
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Uniq!
Спасибо за статью, добавил закладку себе в доки. Сейчас этой темой не занимаюсь, так что в плане помощи по безопасной авторизации я пас.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #7  
Старый 18.07.2014, 21:55
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Общая идея, я так понял, выглядит так:
Если база удаленная - то наверно как-то так. При этом, как я понимаю, все операции должны проводиться на сервере, а программа - лишь юзер-интерфейс. В таких случаях можно сгенерить сервером какой-нибудь одноразовый ключик и до конца сессии программа будет при обращениях его юзать.
Что касается хеширования - пароль можно сначала посолить, а потом уже посчитать хеш.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #8  
Старый 22.07.2014, 13:43
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Что касается шифров - я понял. Хромает архитектура.

Код:
procedure TFormMain.FormCreate(Sender: TObject);
begin
  with TFormLogin.Create(Self) do
    try
      if not Authorization(Users) then // Users - это DataSet с информацией о всех пользователях, хранимых в БД
        Halt;
    finally
      Free;
    end;
end;

После HALT - сыпятся ошибки доступа к памяти. Я понимаю, что это очень жёсткое прерыванием процедуры Чем заменить?
Если Application.Terminate, то форма успевает "мигнуть", не по феншую


В самом методе Authorization я предполагаю:

Код:
while Result <> true do
    Result := ShowModal = mrOK // пока нажимают ОК (пытаясь войти)
    if Users.Locate('Login;Cash', VarArrayOf([edLogin.Text, edCash.Text]),
      []) then // если нашёлся, тогда выходим из цикла, возвращаем true
      Result := true;
  end;
т.е. сам метод возвращает либо true (В случае авторизации) либо false (В случае, когда надо закрывать приложение нафиг).

От идеи с уже открытым окном и кнопкой авторизации пришлось отказаться в силу "указаний руководства". Не хотят показывать даже GUI программы.

Последний раз редактировалось Uniq!, 22.07.2014 в 15:32.
Ответить с цитированием
  #9  
Старый 22.07.2014, 16:14
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Может прописать это в коде самого проекта, до создания форм?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #10  
Старый 22.07.2014, 18:15
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Uniq!
Если Application.Terminate, то форма успевает "мигнуть", не по феншую
Вроде можно так:
Код:
begin
  ...
  Application.ShowMainForm := False;
  ...
end;
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
Этот пользователь сказал Спасибо Freeman за это полезное сообщение:
Uniq! (23.07.2014)
  #11  
Старый 23.07.2014, 10:52
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Код:
Application.ShowMainForm := False;
Помогло, спасибо.

Код:
function TFormLogin.Authorization(Users: TADOTable): boolean;
begin
  dsUsers.DataSet := Users;

  repeat
    if ShowModal = mrOK then
    begin
      if dsUsers.DataSet.Locate('Login;Cash',
        VarArrayOf([edLogin.Text, edCash.Text]), []) then
      begin
        dsUsers.DataSet.Edit;
        if cbRememberMe.Checked = true then
          Users.FieldByName('Remember').AsInteger := 1;
        dsUsers.DataSet.FieldByName('LoginDate').AsDateTime := Now;
        dsUsers.DataSet.Post;
        Result := true;
      end
      else
      begin
        edCash.Clear;
        if edLogin.Text = '' then
          edLogin.SetFocus
        else
          edCash.SetFocus;
      end;
    end
    else
      Break;
  until Result = true;
end;

Т.е. я как делаю: повторять попытки входа, пока пользователь жмёт ok. Как только ShowModal не равен mrOK цикл прерывается и вываливается с Result = False; что влечёт за собой Terminate.

Не нравится "break". Может как-то без этого можно обойтись?
Ответить с цитированием
  #12  
Старый 23.07.2014, 16:17
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Код:
while (not result) and (showmodal = mrok) do
Только result предварительно инициализировать.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter