Респект, Усем!

На нижеследуемый текст меня вдохновила реализация шифрования в YaP и желание 
помочь разработчикам Firebird в скорейшем решении проблемы защиты базы данных. 
К сожелению реализация шифрования в YaP на меня не произвела должного 
впечатления, но уже хорошо что начало положено. Я предлагаю шифрование с 
помощью PGP. Желающим ознакомиться с PGP сюда: http://ru.wikipedia.org/wiki/PGP

Возможно идеи которые я изложу ниже уже витали в головах разработчиков, поэтому 
не судите строго.

1) Для того чтобы защитить базу данных для начала необходимо решить проблему 
PlainText-запросов.
Как известно данные между клиентом и сервером Firebird передаются практически в 
открытом виде, поэтому с помощью таких программ как например FlexTracer 
достаточно просто отследить все запросы посылаемые клиентом серверу и обратно. 
Это значительно упрощает задачу взломщика, который может изучив как работает 
программа, может воспользоваться базой данных поставляемой с этой программой по 
своему усмотрению. Поэтому я предлагаю обратить наш взор на PGP. Для внедрения 
данной технологии необходимо будет внести изменения как в компоненты для 
подключения к серверу т.е. в FibPlus и т.п., так и собственно в сам сервер 
Firebird. Надеюсь разработчики компонентов тоже посещают эту конференцию и 
заинтересуются этой проблемой. Теперь сама технология:

    а)  клиент устанавливает соединение с сервером
    б)  клиент сообщает серверу, что желает работать с ним через зашифрованный 
канал, если все ок, то
    в)  клиент  генерирует свою пару ключей (открытый и закрытый ключ) и сервер 
генерирует тоже свою пару ключей 
    г)  далее происходит обмен открытыми ключами между клиентом и сервером
    д) теперь клиент с помощью открытого ключа сервера может зашифровать данные 
для передачи серверу, а сервер в свою очередь с помощью   открытого ключа 
клиента может зашифровывать данные для передачи клиенту. 


Прехват public(открытых) ключей взломщику ничего не даст, на то они и 
называются открытые, т.е. доступные всем. Расшифровка же данных клиентом и 
сервером будет осущесвлятся ихними private(закрытыми) ключами. Кстати для 
надежности можно задавать интервал генерации и обмена ключами, но увлекатся я 
думаю не стоит, потому что будут тормоза :) Т.е. мы получаем зашифрованный 
канал между клиентом и сервером и программа перехвата остается при своих 
интересах :)

2) Теперь собственно переходим к главной проблеме, защите базы данных. 
Технология:
    а)  клиент посылает запрос серверу о необходимости создать зашифрованную 
базу данных
    б)  сервер генерирует новую пару ключей, создает базу и открытым ключем из 
этой пары шифрует базу т.е. различные ее страницы(page)      (Data, Blob data, 
Index root и т.д.)  
    г) после зашифровки базы я предлагаю записывать в нее открытый ключ для 
компактности, а секретный ключ записывать в файл, рядом с     файлом базы данных
    д) далее этот секретный ключ должен быть помещен в код приложения(клиента), 
которое будет работать с зашифрованной базой, а происходить это должно так:
    е) приложение(клиент) по установленному зашифрованному каналу передает 
секретный ключ серверу, с помощью его и открытого ключа находящегося в базе 
данных сервер будет осуществлять расшифровку/зашифровку самой базы данных.


Добавлю что для лучшей защиты приложение(клиент) и сам сервер желательно 
обернуть в конверт, чтобы защитить от посягательств IDA и SoftIce'а. 

P.S. Конечно это только теория, поэтому прошу высказывать свои замечания и 
пожелания.
От себя хочу заметить, что если что-то подобное заработает на Firebird, то на 
него перейдут многие солидные компании уважающие свой труд.
  
С наилучшими пожеланиями, Oleg Prosvetov.

Ответить