暗号化/パスワード保護を備えたSQLite


136

私はSQLiteの使い方を学んでいるだけで、それが可能かどうか知りたいと思っていました。

  1. データベースファイルの暗号化?

  2. データベースのオープンをパスワードで保護しますか?

PS。この "SQLite暗号化拡張(SEE)"があることは知っていますが、ドキュメントによると、 "SEEはライセンスソフトウェアです..."および "SEEの永続的なソースコードライセンスのコストは2000ドルです。"


それは確かに可能であり、SEE以外にもいくつかのオープンソースソリューションが存在します。その中には、wxSQLite3に付属する暗号化拡張機能があります。詳細については、同様の質問に対する私の回答を参照してください。
Ulrich Telle、2011

1
@RobotMess:正直に言うと、ここにリストされているものはありません。私はそのプロジェクトに厳しい時間的制約があったため、迅速に何かをしなければなりませんでした。私は自分が最も得意とするものを使いました-生データをDBに配置する前にAESを使用しました...ルックアップ、検索、DB管理の点では効率的ではありません。
ahmd0 2013年

@ ahmd0うーん、DBが役に立たないのではないですか。つまり、実際に行うことは、コミットがアトミックであることを確認することだけです。
Navin、2013年

はい、可能です。.Net Standard 4.6.1以降またはCoreを対象とする場合、Sqlite暗号化を取得するのはかなり簡単で、ここでの私の回答に従ってMicrosoft.Data.Sqliteを使用することです
paulyb 2018年

回答:


110

SQLiteには、通常のディストリビューションでは使用されない暗号化用のフックが組み込まれていますが、ここに私が知っているいくつかの実装があります。

  • SEE-公式の実装。
  • wxSQLite -SQLiteの暗号化も実装するwxWidgetsスタイルのC ++ラッパー。
  • SQLCipher -openSSLのlibcryptoを使用して実装します。
  • SQLiteCrypt-カスタム実装、変更されたAPI。
  • botansqlite3 -botansqlite3はSQLite3の暗号化コーデックで、Botanの任意のアルゴリズムを使用して暗号化できます。
  • sqleet -ChaCha20 / Poly1305プリミティブを使用した別の暗号化実装。上記のwxSQLiteはこれを暗号プロバイダーとして使用できることに注意してください。

SEEとSQLiteCryptにはライセンスの購入が必要です。

開示:私はbotansqlite3を作成しました。


1
SQLiteデータベース暗号化の使用方法Botanのドキュメントはありますか?ボタンのウェブサイトはこの機能について言及していません。
MarcSchlösser、2012

5
botansqlite3は現在、Botanから独立して配布されています。
OliJG

1
litereplicaあります。ARMv7ベースのポータブルデバイスでは、AESよりも高速なChaCha暗号を使用しています
ベルナルドラモス

組み込みの暗号化サポートとしてのSQLite3 .Net。現在、この回答はほとんど無効になっています。
Krythic 2018

21

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エディターもユーザーのデータを表示できなくなります。後でパスワードを変更する場合は、パスワードconn.ChangePassword("new_password"); をリセットまたは削除するには、conn.ChangePassword(String.Empty);


16
オープンソースのSqliteでは動作しません。これが想定されている言語の実装、言語、またはAPIの手がかりはありません。
ミケロビ2014

1
ChangePassword使用されている暗号化方法を知るにはどうすればよいですか?AES 128?RSA ..?
qakmak 2015

1
RSA 1024または2048?詳細がわかるドキュメントはありますか?
qakmak

ここからドキュメントを取得するsystem.data.sqlite.org/index.html/doc/trunk/www/index.wiki
マンゲシュ

私自身のテストではSetPassword、このメソッドは(現時点では)基本的に役に立たないように見えます。System.Data.SQLiteライブラリにパスワードを適切に適用させる唯一の方法は、ChangePasswordメソッドを使用することでした。使用SetPassword前に呼び出すことOpenは明らかライブラリで必要とされるように、方法)を、私はまだ任意のパスワードなしSQLiteStudioでDBを開いて編集することができました。パスワードアプリケーションが実際に「スタック」したのは、ChangePasswordメソッドを(メソッド呼び出したに)使用するまででしたOpen
G_Hosa_Phat

15

.netライブラリSystem.Data.SQLiteも暗号化を提供します。


8
ASP.NET!= SQL Server!= SQL Serverのインストールされたインスタンス
Zev Spitz

1
ただし、System.Data.SQLiteはMicrosoftのものではありません。この質問は.Netに関するものではありませんが、そうであれば、他の互換性と非互換性が重要になります。
user34660 2017年

7

sqlite3.dll暗号化サポート付きのファイルはhttp://system.data.sqlite.org/から入手できます。

1- http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wikiに移動し、パッケージの1つをダウンロードします。.NETバージョンはここでは無関係です。

2- SQLite.Interop.dllパッケージから抽出し、名前をに変更しsqlite3.dllます。このDLLは、プレーンテキストのパスワードまたは暗号化キーによる暗号化をサポートしています。

上記のファイルはネイティブであり、.NETフレームワークを必要としません。ダウンロードしたパッケージによっては、Visual C ++ランタイムが必要になる場合があります。

更新

これは、32ビット開発用にダウンロードしたパッケージです。http//system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip


私の特定の例では.lib、実行可能ファイルに埋め込むことができるものが必要でした。DLLがありませんでした。
ahmd0 2014年

2
また、このいずれかをご確認くださいgithub.com/rindeal/wxSQLite3-VSあなたを与えるだろうlibdllファイルを。
Mohammad Banisaeid 2014年

4

以下は、適切なセキュリティソリューションの代わりになるものではありません。

これを4日間試してみた後、NuGetのオープンソースのSystem.Data.SQLiteパッケージのみを使用するソリューションをまとめました。これがどの程度の保護を提供するのかわかりません。私は自分の学習コースでのみ使用しています。これにより、DBが作成され、暗号化され、テーブルが作成され、データが追加されます。

using System.Data.SQLite;

namespace EncryptDB
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = @"C:\Programming\sqlite3\db.db";
            string passwordString = "password";
            byte[] passwordBytes = GetBytes(passwordString);
            SQLiteConnection.CreateFile(connectionString);
            SQLiteConnection conn = new SQLiteConnection("Data Source=" + connectionString + ";Version=3;");
            conn.SetPassword(passwordBytes);
            conn.Open();
            SQLiteCommand sqlCmd = new SQLiteCommand("CREATE TABLE data(filename TEXT, filepath TEXT, filelength INTEGER, directory TEXT)", conn);
            sqlCmd.ExecuteNonQuery();
            sqlCmd = new SQLiteCommand("INSERT INTO data VALUES('name', 'path', 200, 'dir')", conn);
            sqlCmd.ExecuteNonQuery();
            conn.Close();
        }
        static byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            bytes = System.Text.Encoding.Default.GetBytes(str);
            return bytes;
        }
    }
}

オプションで、を削除してconn.SetPassword(passwordBytes);、前ではなくconn.ChangePassword("password");conn.Open();に配置する必要があるものと置き換えることができます。その後、GetBytesメソッドは必要ありません。

復号化するには、openを呼び出す前に接続文字列にパスワードを入力するだけです。

        string filename = @"C:\Programming\sqlite3\db.db";
        string passwordString = "password";
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
        conn.Open();

2
"I think I saw 128 bit somewhere"-暗号化を扱うことを計画している場合、これは非常に悪い発言です。経験則では、ということです決してあなたがそれを理解していない場合はそれを自分もしません。それ以外の場合は、まったく使用しないほうがよいでしょう。
ahmd0

あなたの言ってる事がわかります。私は主に、現在のバージョンのSystem.Data.Sqliteでは機能しないことがわかってきたアドバイスを修正しようとしていました。これが優れたセキュリティであることを示唆するつもりはありませんでした。投稿を更新しました。入力ありがとうございます!
マイクワーナー

2

クライアント側ではいつでもデータを暗号化できます。パフォーマンスの問題があるため、すべてのデータを暗号化する必要があるわけではないことに注意してください。


1

まあ、SEE高価です。ただしSQLite、暗号化用のインターフェースが組み込まれています(Pager)。これは、既存のコードに加えて、暗号化メカニズムを簡単に開発できることを意味しますAES。本当に何でも。こちらの投稿をご覧ください:https : //stackoverflow.com/a/49161716/9418360

ポケットベルの暗号化を有効にするには、SQLITE_HAS_CODEC = 1を定義する必要があります。以下のサンプルコード(元のSQLiteソース):

#ifdef SQLITE_HAS_CODEC
/*
** This function is called by the wal module when writing page content
** into the log file.
**
** This function returns a pointer to a buffer containing the encrypted
** page content. If a malloc fails, this function may return NULL.
*/
SQLITE_PRIVATE void *sqlite3PagerCodec(PgHdr *pPg){
  void *aData = 0;
  CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData);
  return aData;
}
#endif

AES256を使用しC languageSQLite暗号化用の商用バージョンがあります。これはでも動作しPHPますがPHPSQLite拡張機能でコンパイルする必要があります。それSQLiteはその場でデータベースファイルを復号化/暗号化し、ファイルの内容は常に暗号化されます。非常に便利。

http://www.iqx7.com/products/sqlite-encryption


0

SQLiteの関数作成ルーチン(PHPマニュアル)を使用できます。

$db_obj->sqliteCreateFunction('Encrypt', 'MyEncryptFunction', 2);
$db_obj->sqliteCreateFunction('Decrypt', 'MyDecryptFunction', 2);

データを挿入するときは、暗号化関数を直接使用して暗号化されたデータを挿入するか、カスタム関数を使用して暗号化されていないデータを渡すことができます。

$insert_obj = $db_obj->prepare('INSERT INTO table (Clear, Encrypted) ' .
 'VALUES (:clear, Encrypt(:data, "' . $passwordhash_str . '"))');

データを取得するときに、SQL検索機能を使用することもできます。

$select_obj = $db_obj->prepare('SELECT Clear, ' .
 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
 'WHERE PlainText LIKE :searchterm');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.