Дело было вечером, делать было нечего. Тогда я открыл Делфи и решил накидать форму ограничивающую доступ к некоторым настройкам по паролю. Когда дело дошло до кода, то первым решением проверки пароля было занести правильный пароль в строковую переменную, а потом сравнить ее с тем, что ввел пользователь... Но тут вспомнился опыт взлома простейших крекми, на которые уходит меньше минуты, ибо пароль там тоже храниться в строковой переменной, и даже не зная приемов отладки и ассемблера можно тупо выудить нечто похожее на пароль перелопатив все текстовые строки.
Отсюда проблема: хранение не зашифрованного пароля в строковой переменной не является безопасным.
Решение: хранить в переменной не сам пароль, а результат некоторых операций над ним и потом сравнивать этот результат, с результатом операций, проведенных над введенным паролем. Если они совпадают, то проверка пройдена.
Для реализации потребуется в разделе Uses описать StrUtils. В разделе private описываем саму функцию шифрования function Crypt(p:string): String; Далее нажимаем комбинацию Сtrl+Shift+C и в тело функции прописываем код, который будет шифровать пароль:
function TForm2.Crypt(p: string): String; var st:char; pas1,hex:string; i,len:integer; begin pas1:=''; len:=Length(p); for i := 1 to len do begin st:=p[i]; pas1:=IntToStr(ord(st)); hex:=hex+InttoHex(strtoint(pas1),1); end; Crypt:=LeftStr(hex,Length(hex)-len); end;
Для того, чтобы применить алгоритм шифрования к введенному в Edit паролю, вызываем функцию Crypt(Edit1.Text).
На этом все. Далее вы можете вывести результат шифрования, чтобы посмотреть во что превратился первоначальный пароль.
Вот простенькая программка с использованием этой функции (правильный пароль CrackMe):