Защита программ на Delphi
Возможен конечно вариант, если в памяти пароли не хранить, а сверять их с паролями из базы данных, но задача такова, что нужно максимально минимизировать обращения к базе данных, да и при том, если в памяти ничего не хранить, это во многих случаях очень неудобно.
Возможен конечно вариант, если в памяти пароли не хранить, а сверять их с паролями из базы данных, но задача такова, что нужно максимально минимизировать обращения к базе данных, да и при том, если в памяти ничего не хранить, это во многих случаях очень неудобно.
А если хранить не сами строки, а их хэш-значения.
Взять и вычислить для строки значение какой-нибудь навороченной односторонней хэш-функции. Так как это число, то в памяти его выловить гораздо труднее, а после использования строк их можно забивать случайными числами.
А если хранить не сами строки, а их хэш-значения.
Взять и вычислить для строки значение какой-нибудь навороченной односторонней хэш-функции. Так как это число, то в памяти его выловить гораздо труднее, а после использования строк их можно забивать случайными числами.
Советую пользоваться программой Delphi String Protect
Вот сайт
Возможен конечно вариант, если в памяти пароли не хранить, а сверять их с паролями из базы данных, но задача такова, что нужно максимально минимизировать обращения к базе данных, да и при том, если в памяти ничего не хранить, это во многих случаях очень неудобно.
Кстати про хэши:
в винде есь CryptoAPI интерфейс. через него можно шифровать и дешифровывать данные, докучи он предоставляет хэширование (используется по-моему MD5)
вот почитай, там есть примеры, правда на c++
http://www.rsdn.ru/article/crypto/usingcryptoapi.xml#EFFA
8)
Прогу скачал, посмотрел, даже наверное сам такую напишу, тока чуть позже. Но есть проблемы во первых программка немного некорректно работает с константами(константа не может равняться функции) И еще..., данные необходимо защищать находящиеся в памяти, т.е прога загружается, получает данные из базы и естественно хранит их в памяти, где они легко обнаружимы.
hardcase:
Я почитал про хеширование, тока вот что то не понял толком как его можно применить? Тоесть как я понял можно каким то путем шифровать данные с помощью винды, хранить в зашифрованном виде, загружать в зашифрованном, и расшифровывать по нужде?
PS: hardcase скинь мне мыло своё на [email]s_ton@list.ru[/email], а то mail глючит сильно говорит тебя не существует, письма не уходят.
hardcase:
Я почитал про хеширование, тока вот что то не понял толком как его можно применить? Тоесть как я понял можно каким то путем шифровать данные с помощью винды, хранить в зашифрованном виде, загружать в зашифрованном, и расшифровывать по нужде?
В базе данных ты не хранишь парольную пару в чистом виде. Нужно хранить только хэш-значение логина и пасворда.
При вводе конкретных пароля и логина ты просто вычисляешь их хэш-значения и сверяешь с тем, что в базе данных. Это общая схема авторизации.
кстати, а ты шифруешь базу данных?
Delpher:
Прогу скачал, посмотрел, даже наверное сам такую напишу, тока чуть позже. Но есть проблемы во первых программка немного некорректно работает с константами(константа не может равняться функции) И еще..., данные необходимо защищать находящиеся в памяти, т.е прога загружается, получает данные из базы и естественно хранит их в памяти, где они легко обнаружимы.
А может шифровать данные(в таблице), а при использовании дешиф. т.е. типа этого A:=DeShifr(B)
Ну то есть это вариант хранения зашифрованных данных в базе?
Да. С алгоритмом пока не определился, но буду обязательно.
Я вот подумал, если хранить данные в базе зашифрованными, то выполнять какого-либо рода SQL будет довольно сложно. Может считывать необходимые данные из базы, затем их шифровать, когда они уже в массиве будут. Но что-то всё это так усложняет отладку и вообще написание проги.
Ну то есть это вариант хранения зашифрованных данных в базе?
Ты не понял. Хэширование - это не шифрование. При хэшировании строки ты получаешь число это число ты записываешь в БД. Так как при хэшировании используются односторонние хэш функции, то из этого значения невозможно получить исходную строку.
Т.е зная хэш значение и алгоритм хэширования, ты никак не сможешь получить пароль и логин как строки, ну кроме брут форса.
так как это чило, то ты вполне можешь написать запрос в БД
where user_name = hash_value
где user_name это тоже число.
Хэш функция выбирается таким образом, что бы вероятность коллизий была минимальна.
Получаем алгоритм авторизации:
1) запрашиваем парольную пару
2) вычисляем хэш для логина
вычисляем хэш для пароля
3) делаем запрос в БД с полученными хэшами
4) по результатам запроса принимаем или не принимаем юЗВеря
Может например кодировать данные в базе, загружать их так же в кодированном виде, а при необходимости обращения, расшифровывать их. Но SQL все равно потеряет силу и потом типы полей? Что их все string делать? Нехорошо одним словом.
hardcase: А видишь как получается, функция та односторонняя, и если я в базу буду писать хеш значения, я потом их не прочитаю обратно, например не выведу список пользователей программы и отладка затруднится. С отладкой ладно, фиг с ней, походу сложностей всё равно не избежать.
Может например кодировать данные в базе, загружать их так же в кодированном виде, а при необходимости обращения, расшифровывать их. Но SQL все равно потеряет силу и потом типы полей? Что их все string делать? Нехорошо одним словом.
Логин пользователя можно не хэшировать. В этом случае можно зашифровать базу данных пользователей.
А зачем тебе список пользователей?
Возми да создай просто открытый список алиасов ползователей - чисто для отображения в программе; предварительно спросив у пользователя этот самый алиас (сказав, что он будет доступен всем и чтобы он не был похож на логин).
Я тут подумал - хэш, возвращемый виндой имеет размер что-то около 128бит. Я вот не знаю, БД съест такое число или нет.
Вот я тоже подумал, что база потолстеет конкретно. Наверное, стоит шифровать только поле "пароль". Потому что остальные данные нужны в нормальном виде, а иначе как с ними оперировать, если всё будет зашифровано, то я не смогу ни фильтр наложить, ни поиск нормальный сделать, и сортировка тоже будет невозможной.
Согласен. В принципе можно всю информацию о пользоветеле разделить на две части - общедоступная и личная.
В общедоступную входит логин юзера и что-то типа "рост-вес-возраст". В личную - какие-то секретные данные. Как раз эти секретные данные мы и будем шифровать чемнибудь асимметричным (можно RSA).
Аутентификацию можно производить на основе механизма электронных подписей (например как в RSA). В wincrypt, кажется, всё это сделано, нужно только нужные функции вызвать.
Электронную подпись мы нигде не храним, а вычисляем на основе уже имеющейся зашифрованной инфы. А зная пароль мы тоже можем получить электронную подпись - остаётся только сравнить две подписи.
Если нету заголовочного модуля wincrypt.h, переведённго на паскаль, то он в аттче. Файл был слит с джедайского сайта :)
Что-то не могу врубиться с этим CryptAPI, что ты выложил. Как там? Что?
Это перевод заголовочного файла wincrypt.h на pascal. Когда-то давно слил архив с JEDI.
Раз уж речь зашла о Crypto API на Delphi, Я подумал - может у тебя заголовочного файла нету, вот и грузанул его сюда.
С паролями я короче решил следующее: найду неплохой алгоритм и буду просто это поле шифровать. Все равно в начале загрузки проги единственную ценность предоставляют пароли в памяти, их-то я и зашифрую, остальная инфа не важна.