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

Вниз

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

 
Пантелеев Иван   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.043 c
14-1125236692
Chuvak
2005-08-28 17:44
2005.09.25
Delphi 7.1 Update Install


1-1125952931
lauren
2005-09-06 00:42
2005.09.25
ComboBox &amp; razmer shrifta RichEdit


3-1123830568
mrGrey2
2005-08-12 11:09
2005.09.25
Подключенные пользователи


4-1122494084
Михаил(Киров)
2005-07-27 23:54
2005.09.25
Диспетчер задач


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский