SQLite での暗号化とパスワード保護
機密情報を含む大規模なデータベースを扱う場合、それをうまく隠したいと思うのはごく自然なことです。 1つのシステムに残っている場合は、通常はパスワードで十分です。
ただし、セキュリティで保護されていないネットワーク経由でデータベースを送信する場合は、データベースを暗号化することをお勧めします。
暗号化とは
簡単に言えば、暗号化とは、データを読み取るだけでは解読できない読み取り不可能なデータの文字列に変換するプロセスです。 暗号化と復号化にはキーが必要です。
復号化は判読不能なデータを元の形式に戻しますが、暗号化は逆で、判読可能なデータを判読不能な形式に変換します。
データはアルゴリズムに基づいて暗号化されます。 それらの複雑さはさまざまであり、信頼性が高いものもあります。
したがって、使用する暗号化の種類は、キーなしで復号化できないほど信頼できるものでなければなりません。
SQLite でパスワードを設定する方法
SQLite でデータベースを保護するには、他の操作を実行してパスワードを設定する前に、次のコードを使用します。
SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("any_password");
conn.open();
次回は、次を使用してデータベース (SQLite バージョン 3) にアクセスできます。
conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=any_password;");
conn.Open();
これでパスワードをリセットすることもできます:
conn.ChangePassword("new_password");
パスワードの代わりに String.Empty
句を追加すると、パスワードを削除できます。
SQLite でデータベースを暗号化する方法
データの暗号化には複数の方法を採用できます。 それらのほとんどすべてが、完全に安全でデータを正常に暗号化できる拡張機能またはソフトウェアを使用しています。
いくつかの信頼できるオプションを次に示します。
SQLite 暗号化拡張機能 (SEE)
これはSQLite専用の標準暗号化サービスです。 SQLite で暗号化されたファイルと暗号化されていないファイルの両方を読み書きできます。
さらに、ATTACH
コマンドを使用して、SEE
を使用して 2つ以上のファイルを同時に操作することもできます。
この拡張機能では、ファイルの暗号化は非常に簡単です。 以下のコードを使用してこれを行うことができます。
int sqlite3_key
(
sqlite3 *db,
const void *e_key,
int key_size
);
ここで、最初の行は使用されるデータベースを表し、2 番目の行は復号化に使用されるキーを表し、最後の行はキーを格納するために使用されるバイト数を表します。
次のコードを使用して、データベースのキーを変更することもできます。
int sqlite3_rekey
(
sqlite *db,
const void *e_key, int key_size
);
ここで、最初の行はデータベースを表し、2 番目の行には新しいキーとキーの合計サイズが含まれます。
sqlite3_rekey()
を使用して、NULL
キーを指定することにより、以前に暗号化されたデータベースを復号化することもできます。
これが、SEE
がデータベース全体のデータとメタデータを暗号化する方法です。 ただし、これは現在無料で利用できないことに注意することが不可欠です。
wxSQLite
この暗号化サービスは誰でも利用できます。 これは、パブリック ドメインの SQLite データベースの C++ ラッパーと見なすことができます。
これが違うのは、wxSQLite
が基礎となるデータベースを隠そうとしないことです。 代わりに、すべての機能をサポートし、wxStrings
と UTF-8
文字列間の自動変換を使用して UTF-8 コーディングで個別に暗号化します。
他の ANSI
ビルドでは、現在のロケール変換オブジェクト (wxConvCurrent)
が変換に使用されます。 ただし、外部管理ツールを使用してデータベースを変更すると、問題が発生する可能性があることに注意することが重要です。
この鍵ベースの暗号化により、実行時に好みの暗号スキームを選択できます。
SQLCipher
SQLCipher
は、SQLite のオープンソース拡張機能です。 要件に基づいて安全な暗号化サービスを提供します。
たとえば、Community
、Commercial
、Enterprise
などのさまざまなパッケージを提供しています。 いずれも、余分な機能に料金を支払うことなく、必要な機能を提供するように設計されています。
SQLCipher
は優れたパフォーマンスと小さなフットプリントを備えているため、組み込みアプリケーション データベースの保護に最適であり、モバイル開発に適しています。 その機能は次のとおりです。
- 暗号化のオーバーヘッドは 5 ~ 15% のみです。 これは、高速な暗号化を提供することを意味します。
- データベース全体が暗号化されます。
- セキュリティ プラクティスには、
CBC
モードとキー派生が含まれます。 - アプリケーションレベルの暗号化を提供します。
- 査読済みの
OpenSSL
暗号ライブラリがアルゴリズムを提供します。 - 複数のプラットフォームをサポートします。
SQLiteCrypt
この サービスは、あまり速度を犠牲にすることなく、SQLite と同じ AES
である AES 256
暗号化サポートを使用します。 実際、ユーザーにとっては、通常と同じくらい高速に見えます。
提供される機能の一部を次に示します。
- 信じられないほど速いです。
- SQLite ランタイムを置き換えて、
2
PRAGMA
を追加するだけで使用できます。 - 一度に 1つのブロックを復号化するため、ハッカーはメモリ ダンプから何も取得できません。
- ゼロ構成により、簡単なプロセスで暗号化できます。
使用する pragma
ステートメントを以下に示します。
PRAGMA key = 'the passphrase'
PRAGMA lic = 'the license key'
PRAGMA rekey = 'new passphrase'
1つ目は暗号化されたデータベースを作成すること、2つ目は SQLiteCrypt
ソフトウェアの合法的なコピーを特定すること、最後はデータベースを新しいパスフレーズで書き直すことです。
スクリート
Sqleet
は、最適なセキュリティのための高度なアルゴリズムに基づく透過的な暗号化サービスです。 堅牢なサイドチャネル耐性と高いソフトウェア性能を提供します。
クロスコンパイルとクロスプラットフォーム開発を容易にする依存関係がないため、コンパイルは簡単です。
次のように、sqleet
暗号化をサポートする SQLite3 シェルをコンパイルできます。
- Unix -
% gcc sqleet.c shell.c -o sqleet -lpthread -ldl
- Windows -
% gcc sqleet.c shell.c -o sqleet
System.Data.SQLite
これは 暗号化を提供する .NET
ライブラリです。 関連するパッケージをダウンロードした後、SQLite.Interop.dll
を抽出し、sqlite3.dll
に名前を変更します。
これは、平文のパスワードまたは暗号化キーで暗号化します。
関数作成ルーチン
SQLite の関数作成ルーチンを使用することもできます。
$db_obj->sqliteCreateFunction('Encrypt', 'function_name', 2);
$db_obj->sqliteCreateFunction('Decrypt', 'function_name', 2);
これで、データベースを簡単に暗号化し、パスワードを追加できるようになります。
Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!
GitHub