私はSQLiteの使い方を学んでいるだけで、それが可能かどうか知りたいと思っていました。
データベースファイルの暗号化?
データベースのオープンをパスワードで保護しますか?
PS。この "SQLite暗号化拡張(SEE)"があることは知っていますが、ドキュメントによると、 "SEEはライセンスソフトウェアです..."および "SEEの永続的なソースコードライセンスのコストは2000ドルです。"
私はSQLiteの使い方を学んでいるだけで、それが可能かどうか知りたいと思っていました。
データベースファイルの暗号化?
データベースのオープンをパスワードで保護しますか?
PS。この "SQLite暗号化拡張(SEE)"があることは知っていますが、ドキュメントによると、 "SEEはライセンスソフトウェアです..."および "SEEの永続的なソースコードライセンスのコストは2000ドルです。"
回答:
SQLiteには、通常のディストリビューションでは使用されない暗号化用のフックが組み込まれていますが、ここに私が知っているいくつかの実装があります。
SEEとSQLiteCryptにはライセンスの購入が必要です。
開示:私は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);
ChangePassword
使用されている暗号化方法を知るにはどうすればよいですか?AES 128?RSA ..?
SetPassword
、このメソッドは(現時点では)基本的に役に立たないように見えます。System.Data.SQLite
ライブラリにパスワードを適切に適用させる唯一の方法は、ChangePassword
メソッドを使用することでした。使用SetPassword
(前に呼び出すことOpen
は明らかライブラリで必要とされるように、方法)を、私はまだ任意のパスワードなしSQLiteStudioでDBを開いて編集することができました。パスワードアプリケーションが実際に「スタック」したのは、ChangePassword
メソッドを(メソッドを呼び出した後に)使用するまででしたOpen
。
.netライブラリSystem.Data.SQLiteも暗号化を提供します。
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がありませんでした。
以下は、適切なセキュリティソリューションの代わりになるものではありません。
これを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();
"I think I saw 128 bit somewhere"
-暗号化を扱うことを計画している場合、これは非常に悪い発言です。経験則では、ということです決してあなたがそれを理解していない場合はそれを自分もしません。それ以外の場合は、まったく使用しないほうがよいでしょう。
まあ、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 language
たSQLite
暗号化用の商用バージョンがあります。これはでも動作しPHP
ますがPHP
、SQLite
拡張機能でコンパイルする必要があります。それSQLite
はその場でデータベースファイルを復号化/暗号化し、ファイルの内容は常に暗号化されます。非常に便利。
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');