Респект, Усем!
На нижеследуемый текст меня вдохновила реализация шифрования в 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.