私はSQLiteを使用することを学んでいますが、それが可能かどうか興味がありました。
データベースファイルの暗号化?
データベースのオープンをパスワードで保護しますか?
PS。私はこの「SQLite Encryption Extension(SEE)」があることを知っていますが、ドキュメントによると、「SEEはライセンスソフトウェアです...」と「SEEの永久ソースコードライセンスの費用は2000ドルです」。
SQLiteには、通常の配布では使用されない暗号化用のフックが組み込まれていますが、ここで私が知っている実装をいくつか紹介します。
SEE、SQLiteCrypt、およびSQLiteCryptoでは、ライセンスの購入が必要です。
開示:botansqlite3を作成しました。
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);
を使用します
.netライブラリ System.Data.SQLite も暗号化を提供します。
http://system.data.sqlite.org/ から暗号化サポート付きのsqlite3.dll
ファイルを取得できます。
1- http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki に移動して、パッケージの1つをダウンロードします。 .NETバージョンはここでは無関係です。
2-パッケージからSQLite.Interop.dll
を抽出し、名前をsqlite3.dll
に変更します。このDLLは、プレーンテキストパスワードまたは暗号化キーによる暗号化をサポートします。
上記のファイルはネイティブであり、ではなく.NET frameworkを必要とします。ダウンロードしたパッケージによっては、Visual C++ランタイムが必要になる場合があります。
UPDATE
これは、32ビット開発用にダウンロードしたパッケージです。 http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0 .94.0.Zip
それは確かに可能であり、SEE以外にもいくつかのオープンソースソリューションが存在します。その中でも、wxSQLite3に付属している暗号化拡張機能。 詳細については、同様の質問に対する私の答えをご覧ください。
以下は、適切なセキュリティソリューションの代わりになることを意図したものではありません。
これを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メソッドは必要ありません。
復号化するには、開くための呼び出しの前に接続文字列にパスワードを入れるだけです。
string filename = @"C:\Programming\sqlite3\db.db";
string passwordString = "password";
SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
conn.Open();
クライアント側でいつでもデータを暗号化できます。パフォーマンスの問題があるため、すべてのデータを暗号化する必要はありません。
まあ、SEE
は高価です。ただし、SQLite
には、暗号化(Pager)用のインターフェースが組み込まれています。つまり、既存のコードに加えて、暗号化メカニズムを簡単に開発でき、AES
である必要はありません。本当に何でも。こちらの私の投稿をご覧ください: https://stackoverflow.com/a/49161716/941836
Pager暗号化を有効にするには、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を使用したSQLite
暗号化のC language
には商用バージョンがあります-PHP
でも動作しますが、PHP
およびSQLite
拡張機能でコンパイルする必要があります。 SQLite
データベースファイルをその場で復号化/暗号化し、ファイルの内容は常に暗号化されます。非常に便利。
はい、可能です。 .Net Standard 4.6.1+またはCoreをターゲットとする場合、Sqlite暗号化を取得するためのかなり簡単な方法は、回答ごとにMicrosoft.Data.Sqliteを使用することだと思います here 。
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');
Javascriptを使用するプロジェクトの場合、 journeyapps で記述されたパッケージはシームレスに機能します。
https://github.com/journeyapps/node-sqlcipher
Mac/Windows/Linuxで動作しました。プラットフォームでSQLCipherをコンパイルします。 Zeteticからのライセンスに対して支払う必要はありません。
探しているものすべてが含まれています。
sqliteのdbブラウザ:
簡単なテーブル作成、簡単なデータ変更、簡単な削除、見やすいコンポーネント。
資料 :