Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Защита программ на Delphi

9.2K
28 октября 2005 года
Ton
35 / / 13.10.2005
Столкнулся просто с мега проблемой. Например есть программа, там предусмотрена авторизация, т.е перед загрузкой вам предлагается выбрать пользователя и ввести пароль. Как можно защитить данные о паролях пользователей, которых хранятся в памяти. Потому что ломается такая защита элементарно: Берешь какой нибудь сканер памяти, к примеру ArtMoney, вводишь в строку поиска имя нужного пользователя, далее открываешь редактор памяти переходишь к указанному адресу(в котором сканер нашел искомое вами слово) и где-то рядом с именем пользователя будет лежать пароль.

Возможен конечно вариант, если в памяти пароли не хранить, а сверять их с паролями из базы данных, но задача такова, что нужно максимально минимизировать обращения к базе данных, да и при том, если в памяти ничего не хранить, это во многих случаях очень неудобно.
5
28 октября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Ton
Возможен конечно вариант, если в памяти пароли не хранить, а сверять их с паролями из базы данных, но задача такова, что нужно максимально минимизировать обращения к базе данных, да и при том, если в памяти ничего не хранить, это во многих случаях очень неудобно.


А если хранить не сами строки, а их хэш-значения.
Взять и вычислить для строки значение какой-нибудь навороченной односторонней хэш-функции. Так как это число, то в памяти его выловить гораздо труднее, а после использования строк их можно забивать случайными числами.

344
28 октября 2005 года
Delpher
493 / / 14.08.2005
Цитата:
Originally posted by hardcase
А если хранить не сами строки, а их хэш-значения.
Взять и вычислить для строки значение какой-нибудь навороченной односторонней хэш-функции. Так как это число, то в памяти его выловить гораздо труднее, а после использования строк их можно забивать случайными числами.




Советую пользоваться программой Delphi String Protect
Вот сайт

5
28 октября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Ton
Возможен конечно вариант, если в памяти пароли не хранить, а сверять их с паролями из базы данных, но задача такова, что нужно максимально минимизировать обращения к базе данных, да и при том, если в памяти ничего не хранить, это во многих случаях очень неудобно.


Кстати про хэши:
в винде есь CryptoAPI интерфейс. через него можно шифровать и дешифровывать данные, докучи он предоставляет хэширование (используется по-моему MD5)
вот почитай, там есть примеры, правда на c++
http://www.rsdn.ru/article/crypto/usingcryptoapi.xml#EFFA
8)

9.2K
29 октября 2005 года
Ton
35 / / 13.10.2005
Delpher:
Прогу скачал, посмотрел, даже наверное сам такую напишу, тока чуть позже. Но есть проблемы во первых программка немного некорректно работает с константами(константа не может равняться функции) И еще..., данные необходимо защищать находящиеся в памяти, т.е прога загружается, получает данные из базы и естественно хранит их в памяти, где они легко обнаружимы.

hardcase:
Я почитал про хеширование, тока вот что то не понял толком как его можно применить? Тоесть как я понял можно каким то путем шифровать данные с помощью винды, хранить в зашифрованном виде, загружать в зашифрованном, и расшифровывать по нужде?

PS: hardcase скинь мне мыло своё на [email]s_ton@list.ru[/email], а то mail глючит сильно говорит тебя не существует, письма не уходят.
5
29 октября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Ton

hardcase:
Я почитал про хеширование, тока вот что то не понял толком как его можно применить? Тоесть как я понял можно каким то путем шифровать данные с помощью винды, хранить в зашифрованном виде, загружать в зашифрованном, и расшифровывать по нужде?


В базе данных ты не хранишь парольную пару в чистом виде. Нужно хранить только хэш-значение логина и пасворда.
При вводе конкретных пароля и логина ты просто вычисляешь их хэш-значения и сверяешь с тем, что в базе данных. Это общая схема авторизации.
кстати, а ты шифруешь базу данных?

344
29 октября 2005 года
Delpher
493 / / 14.08.2005
Цитата:
Originally posted by Ton
Delpher:
Прогу скачал, посмотрел, даже наверное сам такую напишу, тока чуть позже. Но есть проблемы во первых программка немного некорректно работает с константами(константа не может равняться функции) И еще..., данные необходимо защищать находящиеся в памяти, т.е прога загружается, получает данные из базы и естественно хранит их в памяти, где они легко обнаружимы.



А может шифровать данные(в таблице), а при использовании дешиф. т.е. типа этого A:=DeShifr(B)

9.2K
30 октября 2005 года
Ton
35 / / 13.10.2005
Цитата:
В базе данных ты не хранишь парольную пару в чистом виде. Нужно хранить только хэш-значение логина и пасворда. При вводе конкретных пароля и логина ты просто вычисляешь их хэш-значения и сверяешь с тем, что в базе данных.


Ну то есть это вариант хранения зашифрованных данных в базе?

Цитата:
кстати, а ты шифруешь базу данных?


Да. С алгоритмом пока не определился, но буду обязательно.

Цитата:
А может шифровать данные(в таблице), а при использовании дешиф. т.е. типа этого A:=DeShifr(B)



Я вот подумал, если хранить данные в базе зашифрованными, то выполнять какого-либо рода SQL будет довольно сложно. Может считывать необходимые данные из базы, затем их шифровать, когда они уже в массиве будут. Но что-то всё это так усложняет отладку и вообще написание проги.

5
30 октября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Ton
Ну то есть это вариант хранения зашифрованных данных в базе?


Ты не понял. Хэширование - это не шифрование. При хэшировании строки ты получаешь число это число ты записываешь в БД. Так как при хэшировании используются односторонние хэш функции, то из этого значения невозможно получить исходную строку.
Т.е зная хэш значение и алгоритм хэширования, ты никак не сможешь получить пароль и логин как строки, ну кроме брут форса.
так как это чило, то ты вполне можешь написать запрос в БД

 
Код:
select * from my_db
where user_name = hash_value

где user_name это тоже число.

Хэш функция выбирается таким образом, что бы вероятность коллизий была минимальна.


Получаем алгоритм авторизации:
1) запрашиваем парольную пару
2) вычисляем хэш для логина
вычисляем хэш для пароля
3) делаем запрос в БД с полученными хэшами
4) по результатам запроса принимаем или не принимаем юЗВеря
9.2K
31 октября 2005 года
Ton
35 / / 13.10.2005
hardcase: А видишь как получается, функция та односторонняя, и если я в базу буду писать хеш значения, я потом их не прочитаю обратно, например не выведу список пользователей программы и отладка затруднится. С отладкой ладно, фиг с ней, походу сложностей всё равно не избежать.

Может например кодировать данные в базе, загружать их так же в кодированном виде, а при необходимости обращения, расшифровывать их. Но SQL все равно потеряет силу и потом типы полей? Что их все string делать? Нехорошо одним словом.
5
31 октября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Ton
hardcase: А видишь как получается, функция та односторонняя, и если я в базу буду писать хеш значения, я потом их не прочитаю обратно, например не выведу список пользователей программы и отладка затруднится. С отладкой ладно, фиг с ней, походу сложностей всё равно не избежать.

Может например кодировать данные в базе, загружать их так же в кодированном виде, а при необходимости обращения, расшифровывать их. Но SQL все равно потеряет силу и потом типы полей? Что их все string делать? Нехорошо одним словом.


Логин пользователя можно не хэшировать. В этом случае можно зашифровать базу данных пользователей.

А зачем тебе список пользователей?
Возми да создай просто открытый список алиасов ползователей - чисто для отображения в программе; предварительно спросив у пользователя этот самый алиас (сказав, что он будет доступен всем и чтобы он не был похож на логин).

Я тут подумал - хэш, возвращемый виндой имеет размер что-то около 128бит. Я вот не знаю, БД съест такое число или нет.

9.2K
02 ноября 2005 года
Ton
35 / / 13.10.2005
Вот я тоже подумал, что база потолстеет конкретно. Наверное, стоит шифровать только поле "пароль". Потому что остальные данные нужны в нормальном виде, а иначе как с ними оперировать, если всё будет зашифровано, то я не смогу ни фильтр наложить, ни поиск нормальный сделать, и сортировка тоже будет невозможной.
5
02 ноября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Ton
Вот я тоже подумал, что база потолстеет конкретно. Наверное, стоит шифровать только поле "пароль". Потому что остальные данные нужны в нормальном виде, а иначе как с ними оперировать, если всё будет зашифровано, то я не смогу ни фильтр наложить, ни поиск нормальный сделать, и сортировка тоже будет невозможной.


Согласен. В принципе можно всю информацию о пользоветеле разделить на две части - общедоступная и личная.
В общедоступную входит логин юзера и что-то типа "рост-вес-возраст". В личную - какие-то секретные данные. Как раз эти секретные данные мы и будем шифровать чемнибудь асимметричным (можно RSA).
Аутентификацию можно производить на основе механизма электронных подписей (например как в RSA). В wincrypt, кажется, всё это сделано, нужно только нужные функции вызвать.
Электронную подпись мы нигде не храним, а вычисляем на основе уже имеющейся зашифрованной инфы. А зная пароль мы тоже можем получить электронную подпись - остаётся только сравнить две подписи.

Если нету заголовочного модуля wincrypt.h, переведённго на паскаль, то он в аттче. Файл был слит с джедайского сайта :)

9.2K
04 ноября 2005 года
Ton
35 / / 13.10.2005
Что-то не могу врубиться с этим CryptAPI, что ты выложил. Как там? Что?
5
04 ноября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by Ton
Что-то не могу врубиться с этим CryptAPI, что ты выложил. Как там? Что?


Это перевод заголовочного файла wincrypt.h на pascal. Когда-то давно слил архив с JEDI.
Раз уж речь зашла о Crypto API на Delphi, Я подумал - может у тебя заголовочного файла нету, вот и грузанул его сюда.

9.2K
05 ноября 2005 года
Ton
35 / / 13.10.2005
hardcase: Слушай не знаешь где можно достать алгоритмы 128-битного шифрования? Написанные для Delphi в виде функций.

С паролями я короче решил следующее: найду неплохой алгоритм и буду просто это поле шифровать. Все равно в начале загрузки проги единственную ценность предоставляют пароли в памяти, их-то я и зашифрую, остальная инфа не важна.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог