Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.01.04;
Скачать: [xml.tar.bz2];

Вниз

Как хранить пароли?   Найти похожие ветки 

 
Alex_Ford   (2008-11-19 22:41) [0]

Добрый вечер!

Уважаемые мастера, подскажите пожалуйста, как в таблице хранить пароли, и осуществлять проверку

Я попытался так, но проверка осуществляется как бы по принципу "либо-либо"...... даже не знаю как правильно поставить вопрос.

Код:


procedure TForm5.SpeedButton1Click(Sender: TObject);
var i,j: integer;
begin
 if not (table1.Locate("user",edit1.Text,[loCaseInsensitive]))xor
        (table1.Locate("password",edit2.Text,[loCaseInsensitive]))then
    begin
    form2.showmodal;
    form1.close;


 
Eraser ©   (2008-11-19 22:45) [1]

в таблице не надо хранить пароли. лучше хранить хэши паролей.


 
Alex_Ford   (2008-11-19 22:47) [2]

А как это сделать? Я впервые с этим сталкиваюсь.


 
Sergey13 ©   (2008-11-19 23:08) [3]

> [0] Alex_Ford   (19.11.08 22:41)

Надо выбирать СУБД которая это умеет делать без участия программиста.


 
Юрий Зотов ©   (2008-11-19 23:22) [4]

> Alex_Ford   (19.11.08 22:47) [2]

В Сети легко найти и справку по слову "хэш", и готовые хэш-функции.

Либо [3].


 
KilkennyCat ©   (2008-11-20 00:41) [5]

Прежде чем выбирать метод защиты, сначала нужно оценить степень защиты.
Далеко не всегда так уж прям нужно хэширование.
В моей, например, текущей программке пароли примитивно хранятся в файле настроек, представляющий собой просто текстовый файл.
Ибо задача примитивна - разграничить доступ администратора и оператора, дабы оператор не сбил настройки. Операторами данной программы предполагаются быть люди с уровнем компьютерной грамотности на уровне данной программы.  Да и в случае неправомочного изменения настроек ничего серъезного не произойдет.
Городить хэширование сюда... упаси кто-там-на-небеси.


 
Германн ©   (2008-11-20 01:12) [6]


> Ибо задача примитивна - разграничить доступ администратора
> и оператора, дабы оператор не сбил настройки. Операторами
> данной программы предполагаются быть люди с уровнем компьютерной
> грамотности на уровне данной программы.

+1


 
Anatoly Podgoretsky ©   (2008-11-20 09:16) [7]

> KilkennyCat  (20.11.2008 0:41:05)  [5]

В качестве хеша может выступать CRCx


 
Slym ©   (2008-11-20 09:36) [8]

Alex_Ford   (19.11.08 22:41)
"password",edit2.Text,[loCaseInsensitive]))

CaseInsensitive - непорядок!
лучше

Query.SQL.Text:="SELECT (Count(Name)>0) AS Login
FROM Users
WHERE ((Name= :User) and (Password= :Password));";
Query.Papams[0].Value:="Admin";
Query.Papams[1].Value:="qWeRtY";
Query.Open;
if not Query.Fields[0].asBoolean then raise Exception.Create("Fuck off!");



 
Ega23 ©   (2008-11-20 10:06) [9]


> Далеко не всегда так уж прям нужно хэширование.


Построение md5 или crc от строки в (ну не знаю, в 20 символов) - это фигня. Миллисекунда. Дольше сравнение со значением в базе будет идти.

2 Автор.
Принцип такой: берёшь алгоритм хэширования (какой - дело твоё, их полно). При  заведении пользователя прогоняешь его пароль через данный алгоритм, получаешь хэш пароля. Его записываешь в базу.
При попытке соединения берёшь введённый логин пользователя, находишь по нему нужную запись в БД, берёшь введённый пароль пользователя, прогоняешь его через хэш-алгоритм и сравниваешь полученный хэш с тем, который лежит в БД.


 
KilkennyCat ©   (2008-11-20 11:17) [10]


> Ega23 ©   (20.11.08 10:06) [9]

А причем здесь время работы?
Да пусть оно хоть реактивно.
А время разработки, оно что, даром?


 
Ega23 ©   (2008-11-20 11:29) [11]


> А время разработки, оно что, даром?


function CheckLogin(const Login, Pwd : string; Conn : TADOConnection) : Boolean;
var
 param : TParameter;
begin
 Result := False;
 with TADODataSet.Create(nil) do
 begin
   try
     Connection := Conn;
     CommandText := "select pwd from logins where upper(login)=?";
     param := Parameters.AddParameter;
     param.DataType = ftString;
     param.Direction := pdInput;
     param.Value := ANSIUpperCase(Login);

     try
       Open;
       Result := (Fields[0].AsString = MD5(Pwd));
     except

     end;
     
   finally
     Free;
   end;
 end;
end;


Реализаций md5 в тырнете - тьма.


 
KilkennyCat ©   (2008-11-20 13:31) [12]

В тырнете тьма реализаций чего угодно.

теперь сравни с моим вариантом:

function CheckLogin(const Pwd : string) : Boolean;
begin
Result := Pwd = "hjgbjvfytey";
end;


и вот докажи мне, что мне необходимо что-то круче этого, если что-то круче этого просто НЕНУЖНО.


 
Ega23 ©   (2008-11-20 13:35) [13]


> и вот докажи мне, что мне необходимо что-то круче этого,
>  если что-то круче этого просто НЕНУЖНО.


5 минут, и твой "hjgbjvfytey" будет вскрыт. А хэш будет искаться брутфорсом очень долго.
А если ещё сделать логин не менее 5 символов и писать хэш не от пароля, а от логин + пароль, или даже md5(md5(pwd) + login) - задолбаешься вскрывать. Брутфорс и очень долгий.


 
KilkennyCat ©   (2008-11-20 13:48) [14]


> Ega23 ©   (20.11.08 13:35) [13]


5 минут и я просто заставлю твою функцию при любом раскладе выдавать true.

Но ты не понимаешь что ли? Уровень защиты такого рода иногда просто не нужен. Никто не будет дизассемблировать или брутфорсить, в моем конкретном случае нужна просто защита от рядового пользователя, чтоб не лез в настройки. Если он владеет асмом и знает, что такое брутфорсинг - он уже не рядовой, и пускай лезет, его мозгов хватит, чтоб не напортить, или восстановить напорченное.
Я не говорю, что хэш это плохо.
Просто разные ситуации возможны, автор же данной ветки не уточнял, что он делает, банк-клиент или просто бухгалтерию своей заначки, с защитой от жены и тещи.


 
Anatoly Podgoretsky ©   (2008-11-20 13:53) [15]

> KilkennyCat  (20.11.2008 13:48:14)  [14]

Заначку не надо хранить в базе.


 
Ega23 ©   (2008-11-20 14:01) [16]


> 5 минут и я просто заставлю твою функцию при любом раскладе
> выдавать true.


Есть гораздо более остроумные способы.
Например, некие данные (срок действия пароля, права данного пользователя и т.п.) лежат в бд в виде зашифрованной строки, ключ к которой - и есть твой пароль. Отдельно в бд лежит CRC расшифрованной строки.
Таким образом, при введении пароля расшифровывается некая строка. При совпадении CRC она сериализуется в определённые поля сущности "Пользователь".
И тут ты уже вообще хрен поможешь, даже зная асм.


 
KilkennyCat ©   (2008-11-20 14:14) [17]


> И тут ты уже вообще хрен поможешь, даже зная асм.


Угу. Ну тогда я возьму бутылку водки и пассатижи. И ты мне сам расскажешь все пароли :)

И что получается?
50% программы - заумный код. Два килограмма оборудования(сканер сетчатки глаза, отпечатков пальцев, температуры задницы). Служба безопасности. Ежеутренний инструктаж. Гипноустановка в мозгу. Ампула с цианидом в зубе.


 
Ega23 ©   (2008-11-20 14:22) [18]


> Угу. Ну тогда я возьму бутылку водки и пассатижи. И ты мне
> сам расскажешь все пароли :)


Ну против терморектального криптоанализа никуда не попроёшь...  :)


> 50% программы - заумный код. Два килограмма оборудования(сканер
> сетчатки глаза, отпечатков пальцев, температуры задницы).
>  Служба безопасности. Ежеутренний инструктаж.


Откровенно говоря я 8 лет как раз для различных СБ и писАл.


 
Anatoly Podgoretsky ©   (2008-11-20 15:28) [19]

> KilkennyCat  (20.11.2008 14:14:17)  [17]

Паяльник это сила!


 
KilkennyCat ©   (2008-11-20 16:39) [20]


> 8 лет

Тогда понятно. Это у тебя уже сила привычки.


 
Ega23 ©   (2008-11-20 17:18) [21]


> Тогда понятно. Это у тебя уже сила привычки.


Возможно..  :)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.01.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.005 c
15-1225720717
blackman
2008-11-03 16:58
2009.01.04
Что с сайтом?


1-1205179677
Бэтман
2008-03-10 23:07
2009.01.04
Вывести месяц


15-1225715882
bv7
2008-11-03 15:38
2009.01.04
MySQL + Delphi (доступ и редактирование данных)


2-1227123674
Alex_Ford
2008-11-19 22:41
2009.01.04
Как хранить пароли?


2-1226829339
vegarulez
2008-11-16 12:55
2009.01.04
подскажите про MyHotKey





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский