Saya baru belajar menggunakan SQLite dan saya ingin tahu apakah itu mungkin:
Enkripsi file database?
Kata sandi melindungi pembukaan database?
PS. Saya tahu bahwa ada "SQLite Encryption Extension (SEE)", tetapi menurut dokumentasi, "SEE adalah perangkat lunak berlisensi ...." dan "Biaya lisensi kode sumber abadi untuk SEE adalah US $ 2000."
Jawaban:
SQLite memiliki kait bawaan untuk enkripsi yang tidak digunakan dalam distribusi normal, tetapi berikut beberapa implementasi yang saya ketahui:
SEE dan SQLiteCrypt memerlukan pembelian lisensi.
Pengungkapan: Saya membuat botansqlite3.
sumber
Anda dapat melindungi sandi SQLite3 DB. Untuk pertama kalinya sebelum melakukan operasi apa pun, setel sandi sebagai berikut.
maka lain kali Anda dapat mengaksesnya seperti
Ini tidak akan mengizinkan editor GUI untuk melihat data Anda. Nanti jika Anda ingin mengubah kata sandi, gunakan
conn.ChangePassword("new_password");
Untuk mengatur ulang atau menghapus kata sandi, gunakanconn.ChangePassword(String.Empty);
sumber
ChangePassword
digunakan? AES 128? RSA ..?SetPassword
metode (saat ini) pada dasarnya tampak tidak berguna. Satu-satunya cara saya bisa membuatSystem.Data.SQLite
perpustakaan menerapkan kata sandi dengan benar adalah menggunakanChangePassword
metode ini. MenggunakanSetPassword
( sebelum memanggilOpen
metode, seperti yang tampaknya diperlukan oleh perpustakaan), saya masih bisa membuka dan mengedit DB di SQLiteStudio tanpa kata sandi. Baru setelah saya menggunakanChangePassword
metode ( setelah memanggilOpen
metode) aplikasi kata sandi benar-benar "macet".Library .net System.Data.SQLite juga menyediakan enkripsi.
sumber
Anda bisa mendapatkan
sqlite3.dll
file dengan dukungan enkripsi dari http://system.data.sqlite.org/ .1 - Buka http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki dan unduh salah satu paket. Versi .NET tidak relevan di sini.
2 - Ekstrak
SQLite.Interop.dll
dari paket dan ubah namanya menjadisqlite3.dll
. DLL ini mendukung enkripsi melalui sandi teks biasa atau kunci enkripsi.File yang disebutkan adalah asli dan TIDAK memerlukan kerangka .NET. Mungkin perlu Visual C ++ Runtime tergantung pada paket yang telah Anda unduh.
MEMPERBARUI
Ini adalah paket yang saya unduh untuk pengembangan 32-bit: http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip
sumber
.lib
yang bisa saya masukkan ke dalam executable saya. Saya tidak bisa memiliki dll.lib
dandll
.Perlu diingat, berikut ini tidak dimaksudkan sebagai pengganti solusi keamanan yang tepat.
Setelah bermain-main dengan ini selama empat hari, saya telah mengumpulkan solusi hanya menggunakan paket System.Data.SQLite open source dari NuGet. Saya tidak tahu seberapa besar perlindungan yang diberikannya. Saya hanya menggunakannya untuk program studi saya sendiri. Ini akan membuat DB, mengenkripsinya, membuat tabel, dan menambahkan data.
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; } } }
Secara opsional, Anda dapat menghapus
conn.SetPassword(passwordBytes);
, dan menggantinya denganconn.ChangePassword("password");
yang harus ditempatkan setelah,conn.Open();
bukan sebelumnya. Maka Anda tidak memerlukan metode GetBytes.Untuk mendekripsi, itu hanya masalah meletakkan kata sandi di string koneksi Anda sebelum panggilan dibuka.
sumber
"I think I saw 128 bit somewhere"
- ini adalah pernyataan yang sangat buruk jika Anda berencana berurusan dengan enkripsi. Aturan praktisnya adalah Anda tidak pernah melakukannya sendiri jika Anda tidak memahaminya. Jika tidak, sebaiknya Anda tidak menggunakannya sama sekali.Anda selalu dapat mengenkripsi data di sisi klien. Harap dicatat bahwa tidak semua data harus dienkripsi karena memiliki masalah kinerja.
sumber
Yah,
SEE
itu mahal. NamunSQLite
memiliki antarmuka built-in untuk enkripsi (Pager). Artinya, di atas kode yang ada, seseorang dapat dengan mudah mengembangkan beberapa mekanisme enkripsi, tidak harusAES
. Apa saja. Silakan lihat posting saya di sini: https://stackoverflow.com/a/49161716/9418360Anda perlu mendefinisikan SQLITE_HAS_CODEC = 1 untuk mengaktifkan enkripsi Pager. Kode contoh di bawah (
SQLite
sumber asli ):#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
Ada versi komersial
C language
untukSQLite
enkripsi menggunakan AES256 - ini juga dapat digunakanPHP
, tetapi perlu dikompilasi denganPHP
danSQLite
ekstensi. Ini de / mengenkripsiSQLite
file database dengan cepat, konten file selalu dienkripsi. Sangat berguna.http://www.iqx7.com/products/sqlite-encryption
sumber
Anda dapat menggunakan rutinitas pembuatan fungsi SQLite ( manual PHP ):
Saat memasukkan data, Anda dapat menggunakan fungsi enkripsi secara langsung dan MASUKKAN data terenkripsi atau Anda dapat menggunakan fungsi khusus dan meneruskan data yang tidak terenkripsi:
$insert_obj = $db_obj->prepare('INSERT INTO table (Clear, Encrypted) ' . 'VALUES (:clear, Encrypt(:data, "' . $passwordhash_str . '"))');
Saat mengambil data, Anda juga dapat menggunakan fungsionalitas pencarian SQL:
$select_obj = $db_obj->prepare('SELECT Clear, ' . 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' . 'WHERE PlainText LIKE :searchterm');
sumber
Saya juga punya masalah serupa. Diperlukan untuk menyimpan data sensitif dalam database sederhana (SQLite adalah pilihan yang tepat kecuali keamanan). Akhirnya saya telah menempatkan file database di TrueCrypt encrypted valume.
Aplikasi konsol tambahan memasang drive sementara menggunakan TrueCrypt CLI dan kemudian memulai aplikasi database. Menunggu hingga aplikasi database keluar dan kemudian turun dari drive lagi.
Mungkin bukan solusi yang cocok di semua skenario tetapi bagi saya bekerja dengan baik ...
sumber