5


2

暗号化されたデータベースを埋め込む必要があるC#デスクトップアプリケーションを作成します。 どのタイプのデータベースを使用すればよいですか?

こんにちは、私はアプリで使用するxamlコードのいくつかを生成するために多くのテーブルにアクセスする必要があるC#/ WPFアプリを作成しています。 テーブルには、いくつかの浮動小数点数値データも含まれます。

このプログラムはシングルユーザーであるため、rdbmsはあまり凝っていなくてもかまいませんが、ファイルは「シュリンクラップ」されて送信されるため、暗号化する必要があります。 また、ユーザーに別のプログラムをインストールさせることもできません。

これまでは、暗号化された.accdbデータベースの使用に傾倒してきましたが、より良いオプションを受け入れています。 accdbを使用するには、ユーザーがアクセス権をインストールする必要がありますか?

(注:https://stackoverflow.com/questions/1421612/database-engine-for-a-desktop-application-in-c[C#のデスクトップアプリケーションのデータベースエンジン]および)も参照しています)

9 Answer


11


SQL Server Compact EditionとSQL Liteは、主な2つのオプションのようです。 SQL Server Compactの方が.NETとの統合と日付/時刻の処理が優れているため、これを使用します。 また、再配布可能なファイルはかなり軽量です(2-3MB IIRC)。

SQL Server Compactでは、データベースを暗号化できます。

…​But you will have to be careful with your connection string because クライアントに埋め込まれた暗号化されていないパスワードを取得するのは簡単です。

最後に、SQL Server Compactを選択すると、組み込みのLINQプロバイダーを使用できるようになります。これにより、生活が大幅に楽になる可能性があります。


5


SQL Server Compactを調べましたか?

_ SQL Server Compact 3.5は、無料で使いやすい組み込みデータベースエンジンです。開発者は、Windows XP、Vista、Pocket PC、SmartphoneなどのすべてのWindowsプラットフォームで実行される堅牢なWindowsデスクトップおよびモバイルアプリケーションを構築できます。 _

「このためにユーザーに別のプログラムを強制的にインストールすることもできません。」-アプリケーションで必要なファイルを配布できます。

別の解決策は、暗号化されたxmlファイルを使用することです。 データセットは、xmlファイルを使用して非常に簡単に保存およびロードできます。


2


この回答は、*合計*が比較的*小さなデータセット*を持っているかどうかに依存するため、それに応じて検討してください…​

オブジェクトをコレクションに保持し、ディスクにシリアル化することを検討しましたか?

Linq to Objectsを使用して、結合などを含むデータベースとほぼ同じ方法でクエリを実行できます。

私はこの手法をいくつかの個人プロジェクトで使用しましたが、うまく機能します。*小さなデータセットがあれば。

例としては、ASP.Net用に作成したカスタムメンバーシッププロバイダーがあります。データベースを使用できない場合にこのメソッドを使用します(実際に安価なホスト環境を考えてください)。

私は、基本的に瞬間的な応答を伴う10,000人のユーザーと同じ負荷でテストしました(結局メモリから来ています)。 私が最大100,000人のユーザーを獲得すると、少し低下し始め、500,000ごとに使用できない合計犬になります。

独自の暗号化されたシリアル化/逆シリアル化メソッドを実装できます。

お役に立てれば。


1


これをどのように使用するかについての簡単なシノプシスとそれのシングルユーザーの性質から、RDBMSは多すぎるかもしれません、あなたはおそらくあなたの小さなデータをtext / xmlファイルに保存し、exeにリソースとして埋め込むことができます(必要に応じて暗号化)


1


_ 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#ラッパーセクション)

私はここで1つを使用しています:http://www.codeproject.com/KB/database/cs_sqlitewrapper.aspx[SQLite用のシンプルなC#ラッパー]


1


jeffa00は、データセットがそれほど大きくない場合は、単純なシリアル化でこれを実行できることを指摘しました。 これがいかに簡単かを示す完全な実用的な実装です:

public class DataSerializer
{
  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.WriteData(@"c:\somewhere\something.data", myObject);

そしてそれを読み返します:

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

LINQ to ObjectsはLINQ to SQLよりもはるかに強力であるため、これはSQL Server Compactまたは完全なSQL Serverを使用するよりもはるかに優れています。 多くの場合も高速です。

*ただし*これは、データセットがRAMに簡単に収まる場合にのみ機能します。


1


回答は詳細に依存します。まだC#SQLite(http://code.google.com/p/csharp-sqlite/)がオプションである可能性があります。 データベースのデータが4GB未満の場合、SQL Server Compactは最適な候補です。インストール、構成、xcopyデプロイはありません。


0


VistaDBは、データベースレベルまたはテーブルレベルで、完全な暗号化を使用したxcopy(簡単な展開)をサポートしています。


0


また、http://developer.db4o.com/ [Db4o]もチェックしてください。これは、オープンソースのオブジェクトデータベースです。 オブジェクトデータベースの暗号化と、データのクエリを簡単にするlinqをサポートしています。

  • サポートするコミュニティプロジェクト データベースのhttp://developer.db4o.com/blogs/projects/archive/2009/09/29/xtea-encryption-dll-for-db4o-v7-4.aspx[XTEA暗号化]