SQLiteDBをパスワードで保護します。出来ますか?


87

私は新しい小さなプロジェクトに直面しなければなりません。それは約7または9のテーブルを持ち、それらの最大のものは月に1000行の最大速度で成長します。

私はSQLiteを私のデータベースとして考えました...しかし、誰かがデータベースからデータを変更したい場合に備えて、データベースを保護する必要があります

私の主な質問は:

アクセス時に行うように、sqliteデータベースをパスワードで保護することは可能ですか?

このような小さなソリューションには、他にどのRDBMSをお勧めしますか?

開発はC#で行われますが、私は無料のものを探しています。




デバッグのためにDBを頻繁にロック/ロック解除する必要がある場合は、このツールを試してくださいgoo.gl/12VnQd
Mangesh

ここで解決策を見つけることができますここにリンクの説明を入力してください
Ishwar Rimal 2016年

回答:


72

SQLite3DBをパスワードで保護できます。操作を行う前に、次のようにパスワードを設定してください。

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);

このようなパスワードで保護されたデータベースを開くことができる、これまでに見つけた唯一の無料ツールは、この回答で詳しく説明されているSQLite2009Proです。
JumpingJezza 2015

この例はどの言語ですか?.NETのように見えますか?
pim 2015

1
技術的には、.NETはフレームワークです。C#は、ここに表示されている言語です。
vapcguy 2017年

:また、あなたは次の開口部の前に毎回パスワードを変更したり、エラーが直面し終わることができ、接続文字列を更新するには注意する必要が stackoverflow.com/questions/16030601/...
vapcguyを

パスワードが提供されていない場合、Open()はパスワードで保護されたSQLiteデータベースで失敗することはありません。失敗するのは、その開いているファイルに対する後続のデータまたはメタデータ操作です。
CristiS.18年

33

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");

またはパスワードを使用して既存の暗号化されたデータベース呼び出しを復号化するにはChangePassword()NULL""

// 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は、前の例に示すようにでパスワードを指定するかSetPassword()、新しいを開く前に関数を呼び出しますSQLiteConnection。で指定されたパスワードは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();

2
このリンクのみの回答は、実際、SOでリンクのみの回答を行わない理由の明確な例です。実際のリンクはなくなりました。それはもう存在しません。このサイトを見ることができる唯一の理由は、web.archive.orgによって自動的にアーカイブされたためです。
HanletEscaño

それはもう動作しません、最新バージョンでそのような機能は見つかりませんでした。
MindRoasterMir

12

SQLCipherを使用します。これは、データベースファイルの透過的な256ビットAES暗号化を提供するSQLiteのオープンソース拡張機能です。http://sqlcipher.net


1
スピードはどうですか?sqlcipherを使用すると、パフォーマンスが低下しますか?
TomSawyer 2016年

6

SEEアドオンを使用してSQLiteデータベースを暗号化できます。このようにして、不正アクセス/変更を防ぎます。

SQLiteドキュメントの引用:

SQLite Encryption Extension(SEE)は、SQLiteの拡張バージョンであり、128ビットまたは256ビットのAESを使用してデータベースファイルを暗号化し、不正なアクセスや変更を防ぎます。データベースファイル全体が暗号化されているため、外部の観察者には、データベースファイルにホワイトノイズが含まれているように見えます。ファイルをSQLiteデータベースとして識別するものは何もありません。

このアドオンの詳細については、このリンクを参照てください


7
その拡張機能は、sqliteの有料アドオンでもあります。
ジョンボーカー

3

1つのオプションはVistaDBです。データベース(またはテーブル)をパスワードで保護(およびオプションで暗号化)することができます。


1
より効率的で無料の方法があります!
サワン2012年

1
@MSSしかし、私が言ったように、VistaDBソリューションには、完全なDB接続暗号化ではなく、テーブルレベルでの個別の暗号化など、いくつかの利点があります。これを実現する他の.NETネイティブオプションはありません。また、他のほとんどのオプションとは異なり、純粋に管理されています-無料ではないからといって、より効率的またはより良いオプションがあることを意味するわけではありません-それは完全に使用要件に依存します。
リードコプシー2012年

3

あなたのsqliteデータベースを保護するパスワードについてのあなたの質問のために、私はそれができるとは思わない。

あなたはそれを暗号化することができます、しかしここにそれに関するいくつかの情報があります:

http://sqlcrypt.com/

プラットフォームあたり149ドルです。


3

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)は、データベースファイルを暗号化し、パスワードを設定します。
新しいデータベースファイルが作成された場合にのみ実行されます。この方法で開くと、暗号化されていない古いものは失敗します。


2

これは古い質問ですが、OSレベルでファイルを保護するだけの簡単な解決策ではないでしょうか。ユーザーがファイルにアクセスできないようにするだけで、ユーザーはファイルにアクセスできなくなります。これは単なる推測であり、これが理想的な解決策であるかどうかはわかりません。


2
USBスティックを持っている人なら誰でも別のOSを起動してファイルを読み取ることができるため、これが適切な解決策かどうかはわかりません。
nurettin 2016

それは公平な指摘だと思いますが、その場合はUSBを無効にしてください。マシンに物理的にアクセスできる人がいる場合は、他にもできることがたくさんあります。
デビッドプライス

機密データを保護して、他のことだけがうまくいかないようにします。
トリプリー2016年

SQLiteデータベースでは、これは実際にはまったく不可能です。ユーザーが読み取りと書き込みの両方を行える必要があります。つまり、SQLite DBが存在するフォルダーのACLで、ユーザーにそれらのアクセス許可も許可する必要があります。そのフォルダへの実際のユーザーのアクセス許可のみを許可することで、非ユーザーから保護できますが、それでも「内部脅威」があります。
vapcguy 2017年

1

なぜデータベースを暗号化する必要があるのですか?ユーザーはプログラムを簡単に逆アセンブルしてキーを理解することができます。ネットワーク転送用に暗号化する場合は、暗号化レイヤーをデータベースレイヤーに圧縮する代わりにPGPを使用することを検討してください。


6
ユーザーは起動時にパスワードを要求される可能性があるため、プログラムを分解してもキーを取得できません。
kgadek 2012年

1
Redgate Reflector、またはILSpyを使用します。
Zev Spitz

4
なぜあなたは鍵をプログラムに入れるのですか?それを行わず、ユーザーのパスワードからキーを生成して使用すれば、ソースコードにシークレットは必要ありません。
トランプスター2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.