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

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

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

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

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

Ответы [ 9 ]

11 голосов
/ 18 ноября 2009

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, который может значительно облегчить вашу жизнь.

5 голосов
/ 18 ноября 2009

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

SQL Server Compact 3.5 является бесплатным, простой в использовании встроенный движок базы данных что позволяет разработчикам создавать надежные Рабочий стол Windows и мобильный приложения, которые работают на всех Windows платформы, включая Windows XP, Vista, Карманный компьютер и смартфон.

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

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

2 голосов
/ 18 ноября 2009

Этот ответ ВСЕГО зависит от того, что у вас относительно небольшой набор данных , поэтому примите во внимание его ...

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

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

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

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

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

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

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

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

1 голос
/ 19 ноября 2009

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

1 голос
/ 19 ноября 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. Быстрее во многих случаях.

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

1 голос
/ 18 ноября 2009

SQLite

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

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

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

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

1 голос
/ 18 ноября 2009

Из вашего краткого обзора того, как вы будете использовать это и однопользовательский характер, может быть, СУБД будет излишним, вы можете просто сохранить небольшой объем данных в текстовом / XML-файле и встроить его в качестве ресурса в вашем exe (зашифрованном, если вам нужно)

0 голосов
/ 18 ноября 2009

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

0 голосов
/ 18 ноября 2009

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

...