web-dev-qa-db-ja.com

暗号化/パスワード保護付きのSQLite

私はSQLiteを使用することを学んでいますが、それが可能かどうか興味がありました。

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

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

PS。私はこの「SQLite Encryption Extension(SEE)」があることを知っていますが、ドキュメントによると、「SEEはライセンスソフトウェアです...」と「SEEの永久ソースコードライセンスの費用は2000ドルです」。

117
ahmd0

SQLiteには、通常の配布では使用されない暗号化用のフックが組み込まれていますが、ここで私が知っている実装をいくつか紹介します。

  • _ _を参照 -公式の実装。
  • wxSQLite -SQLiteの暗号化も実装するwxWidgetsスタイルのC++ラッパー。
  • SQLCipher -openSSLのlibcryptoを使用して実装します。
  • SQLiteCrypt -カスタム実装、修正されたAPI。
  • botansqlite -botansqlite3はSQLite3の暗号化コーデックで、Botanの任意のアルゴリズムを暗号化に使用できます。
  • SQLiteCrypto -SQLiteCryptoは、AES-256およびSHA-256でSqliteデータベースを暗号化する簡単な方法です

SEE、SQLiteCrypt、およびSQLiteCryptoでは、ライセンスの購入が必要です。

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

93
OliJG

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);を使用します

18
Mangesh

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

14
Rory

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

7

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

3
Ulrich Telle

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

これを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();
3
Mike Warner

クライアント側でいつでもデータを暗号化できます。パフォーマンスの問題があるため、すべてのデータを暗号化する必要はありません。

2
Marcin

まあ、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データベースファイルをその場で復号化/暗号化し、ファイルの内容は常に暗号化されます。非常に便利。

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

1
q74

はい、可能です。 .Net Standard 4.6.1+またはCoreをターゲットとする場合、Sqlite暗号化を取得するためのかなり簡単な方法は、回答ごとにMicrosoft.Data.Sqliteを使用することだと思います here

0
paulyb

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');
0
Alien426

Javascriptを使用するプロジェクトの場合、 journeyapps で記述されたパッケージはシームレスに機能します。

https://github.com/journeyapps/node-sqlcipher

Mac/Windows/Linuxで動作しました。プラットフォームでSQLCipherをコンパイルします。 Zeteticからのライセンスに対して支払う必要はありません。

0
liangzan

探しているものすべてが含まれています。

sqliteのdbブラウザ:

https://sqlitebrowser.org/

簡単なテーブル作成、簡単なデータ変更、簡単な削除、見やすいコンポーネント。

資料 :

https://github.com/sqlitebrowser/sqlitebrowser/wiki

0
SHO