私は新しい小さなプロジェクトに直面しなければなりません。約7個または9個のテーブルがあり、そのうち最大のものは1か月に最大1000行増加します。
私は私のデータベースとしてSQLiteを考えました...しかし、私は誰かがデータベースからデータを変更したい場合に備えてデータベースを保護する必要があります
私の主な質問は:
アクセス時に行うように、sqlite dbをパスワードで保護することは可能ですか?
このような小さなソリューションには、他にどのRDBMSをお勧めしますか?
開発はC#で行われますが、無料のものを探しています。
SQLite3 DBをパスワードで保護できます。操作を行う前に、次のようにパスワードを設定します。
SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.Open();
次回は次のようにアクセスできます
conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();
これにより、GUIエディターでデータを表示できなくなります。パスワードを入力すると、一部のエディターはDBを復号化できます。使用されるアルゴリズムはRSAです。
後でパスワードを変更する場合は、使用します
conn.ChangePassword("new_password");
パスワードをリセットまたは削除するには、次を使用します
conn.ChangePassword(String.Empty);
Sqlite .netプロバイダーの組み込み暗号化(System.Data.SQLite)を使用できます。詳細は http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx でご覧ください
既存の暗号化されていないデータベースを暗号化する、または暗号化されたデータベースのパスワードを変更する、データベースを開き、SQLiteConnectionのChangePassword()関数を使用します。
// Opens an unencrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
// Encrypts the database. The connection remains valid and usable afterwards.
cnn.ChangePassword("mypassword");
既存の暗号化されたデータベースを復号化するにはNULL
または""
パスワードでChangePassword()
を呼び出します:
// Opens an encrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword");
cnn.Open();
// Removes the encryption on an encrypted database.
cnn.ChangePassword(null);
既存の暗号化されたデータベースを開く、または新しい暗号化されたデータベースを作成するには、前の例に示すようにConnectionString
でパスワードを指定するか、新しいSQLiteConnection
を開く前にSetPassword()
関数を呼び出します。 ConnectionString
で指定されるパスワードはクリアテキストである必要がありますが、SetPassword()
関数で提供されるパスワードはバイナリバイト配列である場合があります。
// Opens an encrypted database by calling SetPassword()
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 });
cnn.Open();
// The connection is now usable
デフォルトでは、ATTACHキーワードは、別のデータベースファイルを既存の接続にアタッチするときにメインデータベースと同じ暗号化キーを使用します。この動作を変更するには、次のようにKEY修飾子を使用します。
クリアテキストパスワードを使用して暗号化されたデータベースを接続する場合:
// Attach to a database using a different key than the main database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY 'mypassword'", cnn);
cmd.ExecuteNonQuery();
バイナリパスワードを使用して暗号化されたデータベースをアタッチするには:
// Attach to a database encrypted with a binary key
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn);
cmd.ExecuteNonQuery();
SQLCipherを使用します。SQLCipherは、データベースファイルの透過的な256ビットAES暗号化を提供するSQLiteのオープンソース拡張機能です。 http://sqlcipher.net
SEEアドオンを使用して、SQLiteデータベースを暗号化できます。これにより、不正なアクセス/変更を防ぎます。
SQLiteドキュメントの引用:
SQLite Encryption Extension(SEE)は、128ビットまたは256ビットのAESを使用してデータベースファイルを暗号化し、不正アクセスや変更を防止するSQLiteの拡張バージョンです。データベースファイル全体が暗号化されているため、外部の観察者にはデータベースファイルにホワイトノイズが含まれているように見えます。ファイルをSQLiteデータベースとして識別するものは何もありません。
このリンク でこのアドオンに関する詳細情報を見つけることができます。
1つのオプションは VistaDB です。データベース(またはテーブル)をパスワードで保護(およびオプションで暗号化)できます。
あなたのsqlite dbを保護するパスワードについての質問については、それができるとは思わない。
あなたはそれを暗号化することができますが、ここにいくつかの情報があります:
プラットフォームあたり149ドルです。
FluentNHibernateを使用する場合、次の構成コードを使用できます。
private ISessionFactory createSessionFactory()
{
return Fluently.Configure()
.Database(SQLiteConfiguration.Standard.UsingFileWithPassword(filename, password))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<DBManager>())
.ExposeConfiguration(this.buildSchema)
.BuildSessionFactory();
}
private void buildSchema(Configuration config)
{
if (filename_not_exists == true)
{
new SchemaExport(config).Create(false, true);
}
}
メソッドUsingFileWithPassword(filename、password)は、データベースファイルを暗号化し、パスワードを設定します。
新しいデータベースファイルが作成された場合にのみ実行されます。暗号化されていない古いものは、この方法で開くと失敗します。
これは古い質問ですが、OSレベルでファイルを保護するだけの簡単な解決策ではないでしょうか。ユーザーがファイルにアクセスできないようにするだけで、ユーザーはファイルにアクセスできなくなります。これは単なる推測であり、これが理想的なソリューションであるかどうかはわかりません。
データベースを暗号化する必要があるのはなぜですか?ユーザーはプログラムを簡単に分解して、キーを見つけ出すことができます。ネットワーク転送のために暗号化する場合は、暗号化層をデータベース層に詰め込む代わりに、PGPの使用を検討してください。