![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как хранить пароли? [D7, XP]
Alex_Ford © (2008-11-19 22:41:00)Добрый вечер!
Уважаемые мастера, подскажите пожалуйста, как в таблице хранить пароли, и осуществлять проверку
Я попытался так, но проверка осуществляется как бы по принципу "либо-либо"...... даже не знаю как правильно поставить вопрос.
Код:
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;
Ega23 (2008-11-20 17:18:00) [1]
> Тогда понятно. Это у тебя уже сила привычки.
Возможно.. :)
KilkennyCat (2008-11-20 16:39:00) [2]
> 8 лет
Тогда понятно. Это у тебя уже сила привычки.
Anatoly Podgoretsky (2008-11-20 15:28:00) [3]> KilkennyCat (20.11.2008 14:14:17) [17]
Паяльник это сила!
Ega23 (2008-11-20 14:22:00) [4]
> Угу. Ну тогда я возьму бутылку водки и пассатижи. И ты мне
> сам расскажешь все пароли :)
Ну против терморектального криптоанализа никуда не попроёшь... :)
> 50% программы - заумный код. Два килограмма оборудования(сканер
> сетчатки глаза, отпечатков пальцев, температуры задницы).
> Служба безопасности. Ежеутренний инструктаж.
Откровенно говоря я 8 лет как раз для различных СБ и писАл.
KilkennyCat (2008-11-20 14:14:00) [5]
> И тут ты уже вообще хрен поможешь, даже зная асм.
Угу. Ну тогда я возьму бутылку водки и пассатижи. И ты мне сам расскажешь все пароли :)
И что получается?
50% программы - заумный код. Два килограмма оборудования(сканер сетчатки глаза, отпечатков пальцев, температуры задницы). Служба безопасности. Ежеутренний инструктаж. Гипноустановка в мозгу. Ампула с цианидом в зубе.
Ega23 (2008-11-20 14:01:00) [6]
> 5 минут и я просто заставлю твою функцию при любом раскладе
> выдавать true.
Есть гораздо более остроумные способы.
Например, некие данные (срок действия пароля, права данного пользователя и т.п.) лежат в бд в виде зашифрованной строки, ключ к которой - и есть твой пароль. Отдельно в бд лежит CRC расшифрованной строки.
Таким образом, при введении пароля расшифровывается некая строка. При совпадении CRC она сериализуется в определённые поля сущности "Пользователь".
И тут ты уже вообще хрен поможешь, даже зная асм.
Anatoly Podgoretsky (2008-11-20 13:53:00) [7]> KilkennyCat (20.11.2008 13:48:14) [14]
Заначку не надо хранить в базе.
KilkennyCat (2008-11-20 13:48:00) [8]
> Ega23 © (20.11.08 13:35) [13]
5 минут и я просто заставлю твою функцию при любом раскладе выдавать true.
Но ты не понимаешь что ли? Уровень защиты такого рода иногда просто не нужен. Никто не будет дизассемблировать или брутфорсить, в моем конкретном случае нужна просто защита от рядового пользователя, чтоб не лез в настройки. Если он владеет асмом и знает, что такое брутфорсинг - он уже не рядовой, и пускай лезет, его мозгов хватит, чтоб не напортить, или восстановить напорченное.
Я не говорю, что хэш это плохо.
Просто разные ситуации возможны, автор же данной ветки не уточнял, что он делает, банк-клиент или просто бухгалтерию своей заначки, с защитой от жены и тещи.
Ega23 (2008-11-20 13:35:00) [9]
> и вот докажи мне, что мне необходимо что-то круче этого,
> если что-то круче этого просто НЕНУЖНО.
5 минут, и твой 'hjgbjvfytey' будет вскрыт. А хэш будет искаться брутфорсом очень долго.
А если ещё сделать логин не менее 5 символов и писать хэш не от пароля, а от логин + пароль, или даже md5(md5(pwd) + login) - задолбаешься вскрывать. Брутфорс и очень долгий.
KilkennyCat (2008-11-20 13:31:00) [10]В тырнете тьма реализаций чего угодно.
теперь сравни с моим вариантом:
function CheckLogin(const Pwd : string) : Boolean;
begin
Result := Pwd = 'hjgbjvfytey';
end;
и вот докажи мне, что мне необходимо что-то круче этого, если что-то круче этого просто НЕНУЖНО.
Ega23 (2008-11-20 11:29:00) [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 11:17:00) [12]
> Ega23 © (20.11.08 10:06) [9]
А причем здесь время работы?
Да пусть оно хоть реактивно.
А время разработки, оно что, даром?
Ega23 (2008-11-20 10:06:00) [13]
> Далеко не всегда так уж прям нужно хэширование.
Построение md5 или crc от строки в (ну не знаю, в 20 символов) - это фигня. Миллисекунда. Дольше сравнение со значением в базе будет идти.
2 Автор.
Принцип такой: берёшь алгоритм хэширования (какой - дело твоё, их полно). При заведении пользователя прогоняешь его пароль через данный алгоритм, получаешь хэш пароля. Его записываешь в базу.
При попытке соединения берёшь введённый логин пользователя, находишь по нему нужную запись в БД, берёшь введённый пароль пользователя, прогоняешь его через хэш-алгоритм и сравниваешь полученный хэш с тем, который лежит в БД.
Slym (2008-11-20 09:36:00) [14]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!');
Anatoly Podgoretsky (2008-11-20 09:16:00) [15]> KilkennyCat (20.11.2008 0:41:05) [5]
В качестве хеша может выступать CRCx
Германн (2008-11-20 01:12:00) [16]
> Ибо задача примитивна - разграничить доступ администратора
> и оператора, дабы оператор не сбил настройки. Операторами
> данной программы предполагаются быть люди с уровнем компьютерной
> грамотности на уровне данной программы.
+1
KilkennyCat (2008-11-20 00:41:00) [17]Прежде чем выбирать метод защиты, сначала нужно оценить степень защиты.
Далеко не всегда так уж прям нужно хэширование.
В моей, например, текущей программке пароли примитивно хранятся в файле настроек, представляющий собой просто текстовый файл.
Ибо задача примитивна - разграничить доступ администратора и оператора, дабы оператор не сбил настройки. Операторами данной программы предполагаются быть люди с уровнем компьютерной грамотности на уровне данной программы. Да и в случае неправомочного изменения настроек ничего серъезного не произойдет.
Городить хэширование сюда... упаси кто-там-на-небеси.
Юрий Зотов (2008-11-19 23:22:00) [18]> Alex_Ford (19.11.08 22:47) [2]
В Сети легко найти и справку по слову "хэш", и готовые хэш-функции.
Либо [3].
Sergey13 (2008-11-19 23:08:00) [19]> [0] Alex_Ford (19.11.08 22:41)
Надо выбирать СУБД которая это умеет делать без участия программиста.
Alex_Ford (2008-11-19 22:47:00) [20]А как это сделать? Я впервые с этим сталкиваюсь.