Текущий архив: 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.54 MB
Время: 0.048 c