Написание настольного приложения C#, в которое необходимо внедрить зашифрованную базу данных. Какой тип базы данных следует использовать?

Эй, SO'ers, я делаю приложение C#/WPF, которому необходимо получить доступ к ряду таблиц, чтобы сгенерировать некоторый код xaml, который я буду использовать в приложении. Таблицы также будут содержать некоторые числовые данные с плавающей запятой.

Программа является однопользовательской, поэтому rdbms не должна быть очень сложной, но файл необходимо зашифровать, так как он будет «упакован в термоусадочную пленку» и отправлен. Я также не могу заставить пользователя установить для этого отдельную программу.

До сих пор я склонялся к использованию зашифрованной базы данных .accdb, но я открыт для лучших вариантов. Требуется ли для использования accdb, чтобы у пользователя был установлен доступ?

(ПРИМЕЧАНИЕ. Я также рассматривал механизм базы данных для настольного приложения в С# и )


person calvin    schedule 18.11.2009    source источник
comment
Спасибо за совет, ребята, я просто читал sqlCE, и мне кажется, что он лучше подходит. Можно ли экспортировать данные из базы данных доступа в sqlCE? Я думаю о том, чтобы сохранить полную базу данных в виде файла доступа только для внутреннего использования, а затем экспортировать подмножество этой базы данных в sqlCE для использования приложением.   -  person calvin    schedule 18.11.2009
comment
относительно приведенного выше комментария это может оказаться полезным: microsoft.com/downloads/   -  person calvin    schedule 18.11.2009


Ответы (9)


SQL Server Compact Edition и SQL Lite кажутся двумя основными вариантами. SQL Server Compact имеет лучшую интеграцию с .NET и обработку даты и времени, поэтому я бы выбрал его. Кроме того, распространяемые файлы имеют довольно небольшой вес (2-3 МБ IIRC).

SQL Server Compact позволит вам зашифровать базу данных:

http://technet.microsoft.com/en-us/library/ms172901.aspx

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

И последнее замечание: выбор SQL Server Compact позволит вам использовать встроенный поставщик LINQ, который может сделать вашу жизнь намного проще.

person Robert Venables    schedule 18.11.2009

Вы изучали SQL Server Compact?

SQL Server Compact 3.5 — это бесплатное и простое в использовании встроенное ядро ​​базы данных, которое позволяет разработчикам создавать надежные настольные и мобильные приложения Windows, работающие на всех платформах Windows, включая Windows XP, Vista, Pocket PC и смартфоны.

"Я также не могу заставить пользователя установить для этого отдельную программу." - вы можете распространять необходимые файлы вместе с вашим приложением.

Другим решением является использование зашифрованного XML-файла. Набор данных можно очень легко сохранить и загрузить с помощью файла xml:

person Philip Wallace    schedule 18.11.2009

Этот ответ ПОЛНОСТЬЮ зависит от того, что у вас относительно небольшой набор данных, поэтому рассмотрите его соответствующим образом...

Рассматривали ли вы возможность хранить свои объекты в коллекции, а затем сериализовать их на диск?

Вы можете использовать Linq to Objects для запроса к ним почти так же, как и к базе данных, включая соединения и т. д.

Я использовал эту технику в нескольких личных проектах, и она отлично работает, ЕСЛИ у вас небольшой набор данных.

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

Я протестировал его с нагрузкой до 10 000 пользователей с практически мгновенными ответами (в конце концов, он исходит из памяти). Когда я добираюсь до 100 000 пользователей, он начинает немного деградировать, и к 500 000 он становится непригодным для использования.

Вы можете реализовать свои собственные зашифрованные методы сериализации/десериализации.

Пошаговое руководство по криптографическому приложению доступно по адресу http://msdn.microsoft.com/en-us/library/bb397867.aspx

Надеюсь это поможет.

person jeffa00    schedule 18.11.2009
comment
+1 отличный ответ. Я тоже постоянно пользуюсь этой техникой. Я опубликовал дополнительный ответ на этот вопрос, содержащий пример кода, который показывает, как легко сделать это всего за 29 строк кода! - person Ray Burns; 19.11.2009

Из вашего краткого обзора того, как вы будете использовать это, и его однопользовательской природы, возможно, RDBMS будет излишним, вы могли бы просто сохранить свой небольшой объем данных в текстовом/xml файле и встроить его как ресурс в свой exe (зашифровано, если нужно)

person Tim Jarvis    schedule 18.11.2009
comment
Вместо этого я много думал об этом, но в данных, которые я использую, есть ряд отношений, которые, похоже, будет сложнее поддерживать в файле xml. У меня также сложилось впечатление, что доступ к данным из файла базы данных будет быстрее, чем анализ серии файлов xml. - person calvin; 18.11.2009
comment
Это зависит от того, легко ли помещаются ваши данные в ОЗУ с достаточным запасом места. Если это так, то для расшифровки и десериализации всего набора данных в дерево объектов в памяти требуется всего около 5 строк кода C#, а еще 5 строк — для его сохранения. Дерево объектов в памяти может выполнять больше запросов, чем SQL Server и др., потому что LINQ to Objects значительно мощнее, чем LINQ to SQL или даже сам SQL. С другой стороны, если ваш набор данных слишком велик, чтобы его можно было легко поместить в ОЗУ (или когда-нибудь может стать таковым), это не лучший вариант, поскольку вам придется вручную управлять загрузкой разделов ваших данных. - person Ray Burns; 18.11.2009
comment
Что касается производительности, если вы собираетесь получить доступ только к 1% данных, обычное ядро ​​базы данных обычно будет быстрее, потому что с диска будет считано меньше данных. Если вы собираетесь получить доступ к 30% или более, загрузка XML-файла обычно будет быстрее. Где-то между этими числами они будут работать одинаково, но где именно, зависит от вашей конкретной ситуации. Итак, опять же, это зависит от того, что вы делаете. - person Ray Burns; 19.11.2009

jeffa00 указал, что это можно сделать с помощью простой сериализации, если ваш набор данных не очень велик. Вот полная рабочая реализация, чтобы показать, насколько это просто:

public class DataSerializer<T>
{
  static XmlSerializer _serializer = new XmlSerializer(typeof(T));
  static SymmetricAlgorithm _encryptionAlgorithm;

  public static void SetEncryptionKey(byte[] key)
  {
    _encryptionAlgorithm = Aes.Create();
    _encryptionAlgorithm.Key = key;
  }

  public static void WriteData(string filePath, T data)
  {
    using(var fileStream = File.OpenWrite(filePath))
    {
      var cryptoStream = new CryptoStream(fileStream, _encryptionAlgorithm, CryptoStreamMode.Write);
      _serializer.Serialize(cryptoStream, data);
      cryptoStream.Flush();
    }
  }

  public static T ReadData(string filePath)
  {
    using(var fileStream = File.OpenRead(filePath))
    {
      var cryptoStream = new CryptoStream(fileStream, _encryptionAlgorithm, CryptoStreamMode.Read);
      return (T)_serializer.Deserialize(Stream);
    }
  }
}

При этом вы можете сохранить целое дерево объектов на диск в зашифрованном виде, просто выполнив:

DataSerializer<MyObjectType>.WriteData(@"c:\somewhere\something.data", myObject);

и прочитайте его обратно с:

myObject = DataSerializer<MyObjectType>.ReadData(@"c:\somewhere\something.data");

Это гораздо приятнее, чем работать с SQL Server Compact или даже с полноценным SQL Server, поскольку LINQ to Objects намного мощнее, чем LINQ to SQL. Быстрее тоже во многих случаях.

Но это работает, только если ваш набор данных легко помещается в ОЗУ.

person Ray Burns    schedule 18.11.2009

sqlite

SQLite — это программная библиотека, которая реализует автономный, бессерверный, не требующий настройки транзакционный механизм базы данных SQL. SQLite — это наиболее распространенный в мире движок базы данных SQL. Исходный код SQLite находится в открытом доступе.

sqlite.phxsoftware.com System.Data.SQLite — это оригинальный механизм базы данных SQLite и полная версия ADO.NET 2.0. /3.5 все объединено в единую сборку смешанного режима. Это полная замена оригинальной sqlite3.dll (вы даже можете переименовать ее в sqlite3.dll, если используете ее изначально).

список доступных оболочек для С# здесь: http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers в разделе оберток C#.

Я использую здесь: Простая оболочка C# для SQLite, которая является базовой. но достаточно для моих нужд

person serge_gubenko    schedule 18.11.2009
comment
У sqlite нет приличного интерфейса для NET Framework, поэтому это плохой выбор для приложения C#. - person Ray Burns; 18.11.2009
comment
это не совсем так, для начала sqlite.phxsoftware.com System.Data.SQLite — исходная база данных SQLite движок и полный поставщик ADO.NET 2.0/3.5 объединены в единую сборку смешанного режима. Это полная замена оригинальной sqlite3.dll (вы даже можете переименовать ее в sqlite3.dll, если используете ее изначально). остальное здесь: sqlite.org/cvstrac/wiki?p=SqliteWrappers в разделе C# Wrappers я использую Simple C# Wrapper для SQLite (codeproject.com/KB/ database/cs_sqlitewrapper.aspx, который я базовый, но делает то, что мне нужно) - person serge_gubenko; 19.11.2009
comment
Спасибо за ссылки. Я не знал о созданных людьми оболочках NET Framework и не смог найти никакой информации об этом на sqlite.org. Жаль, что sqlite не имеет стандартной оболочки, которая, как мы знаем, будет поддерживаться в течение многих лет. Но это мир с открытым исходным кодом для вас. - person Ray Burns; 19.11.2009
comment
просто добавил ссылки в исходный пост. - person serge_gubenko; 19.11.2009
comment
Спасибо за информацию! Прошлой ночью я провел много времени, изучая sqlite и провайдера ADO, на который вы ссылались. Я могу попытаться использовать его для будущих проектов, но я думаю, что я выберу простоту разработки / документирования с помощью материалов MS, а не потенциально меньшие размеры / большую эффективность. - person calvin; 19.11.2009

Ответ может зависеть от более подробной информации; но C#SQLite (http://code.google.com/p/csharp-sqlite/) может быть вариантом. Если ваша база данных будет содержать менее 4 ГБ данных, то SQL Server Compact — идеальный кандидат; без установки, без настройки, развертывание xcopy.

person Kaveh Shahbazian    schedule 18.11.2009

VistaDB поддерживает xcopy (простое развертывание) с полным шифрованием на уровне базы данных или таблицы.

person Reed Copsey    schedule 18.11.2009
comment
Зачем платить за что-то, если SQL Server Compact бесплатен? - person Philip Wallace; 18.11.2009
comment
Он поддерживает гораздо больше, чем SQL Server Compact, а также упрощает развертывание. В зависимости от того, что вы пытаетесь сделать, это может быть гораздо лучший вариант. - person Reed Copsey; 18.11.2009

Также ознакомьтесь с Db4o — объектной базой данных с открытым исходным кодом. Они поддерживают шифрование базы данных объектов, а также linq, что упрощает запрос данных.

person Mark Coleman    schedule 18.11.2009