Главная страница
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

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



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

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

Наверх




Память: 0.57 MB
Время: 0.042 c
5-1100847897
Stanislav
2004-11-19 10:04
2005.09.25
DBControl и Открытие DataSet a


2-1124016175
Гость22
2005-08-14 14:42
2005.09.25
Как определить количество дней между двумя датами?


14-1125152841
Копир
2005-08-27 18:27
2005.09.25
Вирус VBS.Redlof. Вот, ведь сволочь какая!


8-1115611310
Viktop
2005-05-09 08:01
2005.09.25
Проиграть музыку из ресурса


6-1117631212
Poul
2005-06-01 17:06
2005.09.25
Сообщения Windows.