Я знаю що можна зберігати паролі до програми в ini файлах, реєстрі, але проблема в тому що там їх може подивитися будь-який, чи є більш координально спосіб зберігання паролів?
Я читав цю статтю, але там все не те
А ти не зберігай там паролі. Бережи хеш-код пароля, вибравши будь-який несиметричний алгоритм шифрування з ключем достовірніше. Так надходять в переважній більшості систем.
Кещ - наскільки я знаю більшість програм вміють розшифровувати.
Хтось мені казав, що паролі можна зберігати в базі даних - тільки ось як? (Просто я ще ні коли не працював з базами)
> Вміють розшифровувати.
його не можна розшифрувати за визначенням
можна до нього пароль підібрати
Добре, а тоді можна який не будь приклад, як це все дала?
> Хтось мені казав, що паролі можна зберігати в базі даних
>
нічим не відрізняється від зберігання в реєстрі, інішках і т.д. з точки зору доступу. Створювати ж БД заради пароля. це тільки якщо паролів купа :))
function Crypt (s: string): string;
begin
# XA0; Result: = s;
# XA0; for i: = 0 to length (Result) -1 do
# XA0; # XA0; 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);
.
А хто ні будь може мені докладно розповісти як створити маленьку БД для зберігання там паролів, і як їх звідти вважати?
Ти скажи, для чого тобі зберігати пароль?
Моя програма дожна відкриватися по введенню пароля який буде, у кожного створеного в програмі користувача. На даний момент ці паролі і імена користувачів зберігаються в ini-файлі. Але це не безпечно. Саме з цього мені потрібні якісь більш кардинальні методи для зберігання паролів та імен користувачів до програми.
Пантелєєв Іван # XA0; (13.08.05 13:11) [14]
Ну і навіщо для цього зберігати пароль?
Вистачає зберігання хешів
Ні, я думаю, що кеш для мене зараз це ще рано. З цього я хочу щоб паролі до програми зберігалися в БД.
Якщо можна - поясніть як це зробити?
Пантелєєв Іван # XA0;
Користувач вводить пароль "корова", ваша програма отримує це слово "корова" і обробляє якоїсь функцією.
Function ( "корова")
Функція обробляє слово "корова", і видає результат, наприклад його хеш - щось на зразок "abcd3452f67sdf" - саме цей результат Ви записуєте в файл * .ini.
Наступного разу користувач вводить пароль, програма знову обробляє пароль цією функцією, отримує результат і порівнює зі лічених з ini файлу. якщо збігається - користувач отримує доступ.
Так робити зручніше, тому що при паролі "корова" хеш його "abcd3452f67sdf" не дозволить користувачеві отримати доступ - адже програма обробить його і отримає інше значення хешу. Тому ховати хеш не потрібно - він фактично нічого не дає зловмиснику - як пароль не діє і отримати з нього реальний пароль "корова" так само не вийде.
Зручно і швидко розраховувати хеш використовуючи алгоритм MD5 - там є функція "Розрахувати хеш рядка"
все разом кілобайт 20
function EnDeCrypt (const text: String): String;
var i: integer;
begin
# XA0; Result: = text;
# XA0; for i: = 1 to Length (text) do
# XA0; # XA0; Result [i]: = chr (not (ord (text [i])));
end;
vrem # XA0; (13.08.05 20:46) [22]
Чогось я там з кешем нічого не зрозумів.
Може у кого ні бидь є більш кращий приклад або ну не знаю.
Пантелєєв Іван # XA0; (15.08.05 1:03) [24]
Суть хешування в тому, щоб не зберігати дані (в твоєму випадку пароль) ні в відкритому вигляді, ні в зашифрованому. Замість цього дані обробляються спеціально хеш-ф-цією, яка для одних і тих самих вихідних даних повертає однакове значення, причому:
1. підібрати різні вихідні дані при обробці яких ф-ція поверне однакові значення практично неможливо
2. під що повертається значенням неможливо восстоновіть вихідні дані
У твоєму випадку тобі лише потрібно дізнатися чи є введений користувачем пароль вірним. Для цього ти повинен викликати хеш-функцію (функцію яка обробляє дані) для того пароля який ввів користувач і значення, яке ця ж ф-ція повернула для правильного пароля, яке ти можеш зберігати в будь-якому місці у відкритому вигляді. Так ось, якщо ці 2 значення збігаються, значить користувач ввів правильний пароль.
P.S. Якщо щось незрозуміло, то краще спитай що, а не відмовляйся від даного методу.
P.P.S. Кеш і Хеш абсолютно різні речі)
P.S. а що таке Хеш?
Пантелєєв Іван # XA0; (15.08.05 10:11) [27]
> Delphi пише - що неможливо знайти файл md5.dcu
Ммм, а ти скачав md5.pas і кинув його в папку проекту?
P.S.
Хеш, він же Хеш, він же Hash
Хеш-функція - ф-ція на вході отримує деякі дані, і має на виході деякий унікальне значення фіксованої довжини
Хеш-значення - значення повернене хеш-ф-цією
> Та й потім можна задати мінімальну довжину пароля. наприклад
> Знаків 10.
Мінімальна кількість знаків ніяк не вплине на складність визначення пароля, "прихованого" через xor (якщо тільки "зломщик", що не буде підбирати його методом проб і помилок, набираючи його з клавіатури :))
Так я скачував, mb5.pas але, це нічого не змінило, всерівно вилазін помилка.
2. Зберігати все в бінарному файлі, там же проксорений пароль.
Пантелєєв Іван # XA0; (15.08.05 16:00) [31]
> Так я скачував
А в папку з проектом поклав?
А можна інструкцію як зробити бінарний файл?
У мене йде перевірка пароля в Edit "е щось типу цього:
if Edit1.Text <> "Пароль" then.
Чорт би забрав того, хто розмістив цю гілку в конфе "Початківці"!
Так, треба було в БД перемістити. Або ВиньАПІ.
Пантелєєв Іван # XA0; (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") thenbegin
_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
Delphi не може знайти TPassElement!
а ловеркейс-то навіщо? щоб менш надійно було?
і з точки зору надійності від злому: все, що треба знайти і обійти, це -
if (lowercase (_name) = lowercase (pe._name)) and (lowercase (pass) = lowercase (pe._pass)) then
Що не складніше розібрати проксоренний пароль.