Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.25;
Скачать: CL | DM;

Вниз

Хранение паролей   Найти похожие ветки 

 
Пантелеев Иван   (2005-08-13 00:10) [0]

Я знаю что можно хранить пароли к программе в ini файлах, реестре, но проблема в том что там их может посмотреть любой, есть ли более координальный способ хранения паролей?


 
alex-drob ©   (2005-08-13 00:15) [1]

http://delphimaster.net/view/1-1123671051/


 
Пантелеев Иван   (2005-08-13 00:19) [2]

Я читал эту статью, но там всё не то


 
DrPass ©   (2005-08-13 00:32) [3]

А ты не храни там пароли. Храни хеш-код пароля, выбрав любой несимметричный алгоритм шифрования с ключом подлиннее. Так поступают в подавляющем большинстве систем.


 
Пантелеев Иван   (2005-08-13 00:36) [4]

Кещ - насколько я знаю большинство программ умеют расшифровывать.
Кто-то мне говорил, что пароли можно хранить в базе данных - только вот как? (Просто я ещё ни когда не работал с базами)


 
ferr ©   (2005-08-13 00:41) [5]


> умеют расшифровывать.

его нельзя расшифровать по определению
можно к нему пароль подобрать


 
Пантелеев Иван   (2005-08-13 00:50) [6]

Хорошо, а тогда можно какой ни будь пример, как это всё далается?


 
KilkennyCat ©   (2005-08-13 01:04) [7]


> Кто-то мне говорил, что пароли можно хранить в базе данных
>

ничем не отличается от хранения в реестре, инишках и т.д. с точки зрения доступа. Создавать же БД ради пароля... это только если паролей куча :))


 
Кефир87 ©   (2005-08-13 01:21) [8]

function Crypt(s:string):string;
begin
 Result := s;
 for i := 0 to length(Result)-1 do
   if odd(i) then Result[i] := Result[i] xor 5 else Result[i] := Result[i] xor 2;
end;

...
AssignFile(f, "password.txt");
Reset(f);
Readln(f, s);
s := Crypt(s);
CloseFile(f);
...

AssignFile(f, "password.txt");
Rewrite(f);
Writeln(Crypt(s));
CloseFile(f);
...


 
DrPass ©   (2005-08-13 01:37) [9]


> Кещ - насколько я знаю большинство программ умеют расшифровывать

Не "кещ" (это кеш или клещ подразумевался?), а хеш. Он не расшифровывается. Вернее, не расшифровывается, если алгоритм несимметричный. В этом случае пароль можно подобрать только перебором. Ну а возможность такого подбора за приемлемое время напрямую зависит от длины и сложности самого пароля, а также от длины ключа шифрования.

> Кефир87 ©   (13.08.05 01:21) [8]

Xor-шифрование. Хорошо. Это самый простой алгоритм. Но он, к сожалению, симметричный. Легко взламывается и без перебора.

> Пантелеев Иван   (13.08.05 00:50) [6]

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


 
Совет   (2005-08-13 01:38) [10]


> Кефир87 ©   (13.08.05 01:21) [8]

Если юзер задаст пароль коротким, то подобрать будет эллементарно.


 
Пантелеев Иван   (2005-08-13 01:38) [11]

А кто ни будь может мне подробно рассказать как создать маленькую БД для хранения там паролей, и как их от туда считать?


 
Alexander Panov ©   (2005-08-13 01:40) [12]

Ты скажи, для чего тебе хранить пароль?


 
KilkennyCat ©   (2005-08-13 01:41) [13]

Удалено модератором


 
Пантелеев Иван   (2005-08-13 13:11) [14]

Моя программа дожна открываться по вводу пароля который будет, у каждого созданного в программе пользователя. На данный момент эти пароли и имена пользователей хранятся в ini-файле. Но это не безопастно. Именно по этому мне нужны какие-то более кардинальные методы для хранения паролей и имён пользователей к программе.


 
Пантелеев Иван   (2005-08-13 13:14) [15]

DrPass ©   (13.08.05 01:37) [9]
А можно ссылку на Lockbox


 
Anatoly Podgoretsky ©   (2005-08-13 13:23) [16]

Пантелеев Иван   (13.08.05 13:11) [14]
Ну и зачем для этого хранить пароль?


 
Пантелеев Иван   (2005-08-13 14:52) [17]

Тоесть?


 
Anatoly Podgoretsky ©   (2005-08-13 15:41) [18]

Хватает хранение хешей


 
Пантелеев Иван   (2005-08-13 19:41) [19]

Нет, я думаю, что кеш для меня сейчас это ещё рано. По этому я хочу чтобы пароли к программе хранились в БД.


 
Пантелеев Иван   (2005-08-13 19:42) [20]

Если можно - объясните как это сделать?


 
vrem   (2005-08-13 20:03) [21]

Пантелеев Иван  
Пользователь вводит пароль "корова", ваша программа получает это слово "корова" и обрабатывает некой функцией.
Function("корова")
Функция обрабатывает слово "корова", и выдаёт результат, например его хеш - что то вроде "abcd3452f67sdf" - именно этот результат Вы записываете в файл *.ini.

В следующий раз пользователь вводит пароль, программа опять обрабатывает пароль этой функцией, получает результат и сравнивает со считанным из ini файла. если совпадает - пользователь получает доступ.

Так делать удобнее, т.к. при пароле "корова" хеш его "abcd3452f67sdf" не позволит пользователю получить доступ - ведь программа обработает его и получит другое значение хеша. Поэтому прятать хеш не нужно - он фактически ничего не даёт злоумышленнику - как пароль не действует и получить из него реальный пароль "корова" так же не получится.
Удобно и быстро рассчитывать хеш используя алгоритм MD5 - там есть функция "Рассчитать хеш строки"


 
vrem   (2005-08-13 20:46) [22]

Исходник Md5 и исходник програмы для тестирования исходника MD5
http://www.fichtner.net/delphi/md5.delphi.phtml

всё вместе килобайт 20


 
bva ©   (2005-08-13 21:10) [23]

Кодируй пароль

function EnDeCrypt(const text:String):String;
var i:integer;
begin
 Result:=text;
 for i:=1 to Length(text) do
   Result[i]:=chr(not(ord(text[i])));
end;


 
Пантелеев Иван   (2005-08-15 01:03) [24]

vrem   (13.08.05 20:46) [22]
Чего-то я там с кешем ничего не понял.
Может у кого ни быдь есть более лучший пример или ну не знаю ...


 
Zeqfreed ©   (2005-08-15 01:26) [25]

Пантелеев Иван   (15.08.05 1:03) [24]
Суть хэширования в том, чтобы не сохранять данные (в твоем случае пароль) ни в открытов виде, ни в зашифрованном. Вместо этого данные обрабатываются специально хэш-ф-цией, которая для одних и тех же исходных данных возвращает одинаковое значение, причем:
1. подобрать различные исходные данные при обработке которых ф-ция вернет одинаковые значения практически невозможно
2. во возвращаемому значению невозможно восстоновить исходные данные

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

Как уже было сказано, исходник хэш-функции и пример использования можно взять здесь:
http://www.fichtner.net/delphi/md5.delphi.phtml

P.S. Если что-то непонятно, то лучше спроси что, а не отказывайся от данного метода.

P.P.S. Кеш и Хэш абсолютно разные вещи )


 
Zeqfreed ©   (2005-08-15 01:28) [26]

Zeqfreed ©   (15.08.05 1:26) [25]
Ой-ё, извиняюсь за грамматику и опечатки, что-то я сегодня заработался :)


 
Пантелеев Иван   (2005-08-15 10:11) [27]

Я скачал примеры с http://www.fichtner.net/delphi/md5.delphi.phtml но у меня не получается скомпилировать пример:
Delphi пишет - что не возможно найти файл md5.dcu

P.S. а что такое Хеш?


 
Zeqfreed ©   (2005-08-15 11:14) [28]

Пантелеев Иван   (15.08.05 10:11) [27]

> Delphi пишет - что не возможно найти файл md5.dcu


Ммм, а ты скачал md5.pas и кинул его в папку проекта?

P.S.
Хеш, он же Хэш, он же Hash
Хэш-функция - ф-ция на входе получающая некоторые данные, и имеющая на выходе некоторое уникальное значение фиксированной длинны
Хэш-значение - значение возвращенное хэш-ф-цией


 
Кефир87 ©   (2005-08-15 12:25) [29]

xor алгоритм в данном случае не так уж плох. Я просто не думаю что будут злые недображелатели которые яростно захотят взломать программу автора, а xor поможет скрыть пароль от любопытных глаз 8) Да и потом можно задать минимальную длинну пароля. Например знаков 10...


 
evvcom ©   (2005-08-15 12:50) [30]


> Да и потом можно задать минимальную длинну пароля. Например
> знаков 10...

Минимальное количество знаков никак не повлияет на сложность определения пароля, "скрытого" через xor (если только "взломщик", не будет подбирать его методом проб и ошибок, набирая его с клавиатуры :) )


 
Пантелеев Иван   (2005-08-15 16:00) [31]

Да я скачивал, mb5.pas но, это ничего не изменило, всеравно вылазин ошибка.


 
Zeqfreed ©   (2005-08-15 16:28) [32]

Кефир87 ©   (15.08.05 12:25) [29]
Я тут вижу два более-менее приемлимых решения:
1. Хранить все в ини-файле, и там же хэш-значение пароля, потому что он не вызовет таких подозрений как кракозябры полученные в результате ксорения пароля.

2. Хранить все в бинарном файле, там же проксореный пароль.

Пантелеев Иван   (15.08.05 16:00) [31]

> Да я скачивал

А в папку с проектом положил?


 
Кефир87 ©   (2005-08-15 21:24) [33]


> 2. Хранить все в бинарном файле, там же проксореный пароль.

Ну я это и предлогаю. Конечно способ не надежный для серьезных проэктов. Я просто предпологаю что для программы автора ветки этого будет вполне достаточно 8)


 
Пантелеев Иван   (2005-08-16 01:01) [34]

Кефир87 ©   (15.08.05 21:24) [33]

А можно инструкцию как сделать бинарный файл?
У меня идёт проверка пароля в Edit"е что-то типа этого:

if Edit1.Text <> "Пароль" then ...


 
Германн ©   (2005-08-16 02:02) [35]

Чёрт бы побрал того, кто разместил сию ветку в конфе "Начинающие"!


 
KilkennyCat ©   (2005-08-16 08:14) [36]


> [35] Германн ©   (16.08.05 02:02)


Да, надо было в БД переместить. Или ВыньАПИ.


 
Antonn ©   (2005-08-16 08:55) [37]

Пантелеев Иван   (16.08.05 1:01) [34]
Примерно так (только вместо пароля можно сохранять хеш, и шифровать перед сохранением):
procedure TForm1.SavePassword(_name,pass:string);
var _MM:TMemoryStream; PE:TPassElement;
begin
_MM:=TMemoryStream.Create;
try
PE._name:=_name;
PE._pass:=pass;
_mm.Write(pe,sizeof(TPassElement));
_mm.SaveToFile(extractfilepath(application.ExeName)+"key");
finally
_mm.Free;
end;
end;

function TForm1.CheckPassword(_name,pass:string):boolean;
var _MM:TMemoryStream; PE:TPassElement;
begin
result:=false;
_MM:=TMemoryStream.Create;
try
if fileexists(extractfilepath(application.ExeName)+"key") then begin
_mm.LoadFromFile(extractfilepath(application.ExeName)+"key");
_mm.Read(pe,sizeof(TPassElement));
if (lowercase(_name)=lowercase(pe._name))and(lowercase(pass)=lowercase(pe._pass)) then
result:=true;
end;
finally
_mm.Free;
end;
end;

использование:
if CheckPassword(edit1.Text,edit2.Text) then


 
Пантелеев Иван   (2005-08-16 13:16) [38]

Delphi не может найти TPassElement!


 
KilkennyCat ©   (2005-08-16 13:26) [39]


> Antonn ©   (16.08.05 08:55)


а ловеркэйс-то зачем? чтоб менее надежно было?


 
KilkennyCat ©   (2005-08-16 13:29) [40]

и с точки зрения надежности от взлома: все, что надо найти и обойти, это -
if (lowercase(_name)=lowercase(pe._name))and(lowercase(pass)=lowercase(pe._pass)) then

Что не сложнее разобрать проксоренный пароль.


 
Antonn ©   (2005-08-16 16:10) [41]

Пантелеев Иван   (16.08.05 13:16) [38]
Delphi не может найти TPassElement!

тьфу, елки, забыл:)

type
TPassElement = record
_name:shortstring;
_pass:shortstring;
end;


KilkennyCat ©   (16.08.05 13:26) [39]
а ловеркэйс-то зачем? чтоб менее надежно было?

так инетресней, не навижу регистры:)

KilkennyCat ©   (16.08.05 13:29) [40]
ну и ладно, можно подумать [34] сложнее:)))


 
Пантелеев Иван   (2005-08-17 00:58) [42]

Antonn ©   (16.08.05 08:55) [37]
Всё скомпилировалось - только вот я чего-то не совсем понимаю что делает этот код.


 
Пантелеев Иван   (2005-08-17 00:59) [43]

Antonn ©   (16.08.05 08:55) [37]
Всё скомпилировалось - только вот я чего-то не совсем понимаю что делает этот код.


 
Германн ©   (2005-08-17 01:27) [44]

2 Пантелеев Иван   (17.08.05 00:58) [42]
>Antonn ©   (16.08.05 08:55) [37]
>Всё скомпилировалось - только вот я чего-то не совсем понимаю >что делает этот код.

Я тоже не понимаю, "что делает этот код"?
Но я и не понимаю как могло "Всё скомпилироваться", если в B>описании функции CheckPassword - один параметр, а в использовании - два?


 
KilkennyCat ©   (2005-08-17 01:31) [45]


> [44] Германн ©   (17.08.05 01:27)


в описании 2 параметра, просто форматирование отсутствует. О чем уже неоднократно говорилось: печатайте читабельно! и пользуйтесь < СODE > < /CODE >


 
Antonn ©   (2005-08-17 05:40) [46]

Пантелеев Иван   (17.08.05 0:58) [42]
первая процедура сохраняет имя и пароль (в edit1.Text имя, в edit2.Text - пароль):
SavePassword(edit1.Text,edit2.Text);

вторая функция проверяет его:
if CheckPassword(edit1.Text,edit2.Text) then
//проверку прошла
else
//проверку не прошла


Германн ©   (17.08.05 1:27) [44]
там запятая есть...

KilkennyCat ©   (17.08.05 1:31) [45]
О чем уже неоднократно говорилось: печатайте читабельно! и пользуйтесь < СODE > < /CODE >

я пытался, просто про Code забыл



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

Текущий архив: 2005.09.25;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.037 c
2-1123877404
Пантелеев Иван
2005-08-13 00:10
2005.09.25
Хранение паролей


3-1123734628
Fedor
2005-08-11 08:30
2005.09.25
Запрос для связанных таблиц


11-1107165644
o.bender
2005-01-31 13:00
2005.09.25
Пример работы TreeView


14-1125872684
KilkennyCat
2005-09-05 02:24
2005.09.25
5 сентября. С Днем Рождения!


1-1125410721
CrowD
2005-08-30 18:05
2005.09.25
Вызов метода минуя непосредственного предка?