Kata Sandi Melindungi DB SQLite. Apa itu mungkin?

88

Saya harus menghadapi proyek kecil yang baru. Ini akan memiliki sekitar 7 atau 9 tabel, yang terbesar dari mereka akan tumbuh dengan kecepatan maksimum 1000 baris sebulan.

Saya berpikir tentang SQLite sebagai db saya ... Tetapi saya perlu melindungi db jika ada yang ingin mengubah data dari db

Pertanyaan utama saya adalah:

Apakah mungkin kata sandi melindungi db sqlite seperti yang akan Anda lakukan pada akses?

RDBMS apa lagi yang akan Anda rekomendasikan untuk solusi sekecil itu?

Pengembangannya akan di C #, tapi saya mencari sesuatu yang gratis.

Jhonny D. Cano -Leftware-
sumber
2
Anda mungkin ingin melihat SQLiteCrypt
Mike Buckbee
Jika Anda perlu sering mengunci / membuka kunci DB untuk debugging, coba alat ini goo.gl/12VnQd
Mangesh
Anda dapat menemukan solusinya di sini masukkan deskripsi tautan di sini
Ishwar Rimal
Kemungkinan duplikat SQLite dengan enkripsi / perlindungan kata sandi
iammilind

Jawaban:

72

Anda dapat melindungi sandi SQLite3 DB. Sebelum melakukan operasi apa pun, atur kata sandi sebagai berikut.

SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.Open();

maka lain kali Anda dapat mengaksesnya seperti

conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();

Ini tidak akan mengizinkan editor GUI untuk melihat data Anda. Beberapa editor dapat mendekripsi DB jika Anda memberikan kata sandinya. Algoritma yang digunakan adalah RSA.

Nanti jika Anda ingin mengubah kata sandi, gunakan

conn.ChangePassword("new_password");

Untuk mengatur ulang atau menghapus kata sandi, gunakan

conn.ChangePassword(String.Empty);
Mangesh
sumber
Sejauh ini, satu-satunya alat gratis yang saya temukan yang akan membuka database yang dilindungi kata sandi seperti ini adalah SQLite2009 Pro yang dirinci dalam jawaban ini .
JumpingJezza
Bahasa apa contoh ini? Sepertinya .NET?
pim
1
Secara teknis, .NET adalah kerangka kerja. C # adalah bahasa yang ditampilkan di sini.
vapcguy
Selain itu, Anda harus berhati-hati dengan memperbarui string koneksi sebelum pembukaan berikutnya setiap kali Anda mengubah kata sandi atau Anda dapat menghadapi kesalahan: stackoverflow.com/questions/16030601/…
vapcguy
Perhatikan bahwa, tanpa kata sandi yang diberikan, Open () TIDAK akan gagal pada database SQLite yang dilindungi kata sandi, seperti yang Anda harapkan! Yang gagal adalah operasi data atau metadata berikutnya pada file yang terbuka itu.
Cristi S.
33

Anda dapat menggunakan enkripsi built-in dari penyedia sqlite .net (System.Data.SQLite). Lihat detail lebih lanjut di http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx

Untuk mengenkripsi database tidak terenkripsi yang ada , atau untuk mengubah kata sandi database yang dienkripsi , buka database lalu gunakan fungsi ChangePassword () dari SQLiteConnection:

// Opens an unencrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
// Encrypts the database. The connection remains valid and usable afterwards.
cnn.ChangePassword("mypassword");

Untuk mendekripsi panggilan database terenkripsi yang adaChangePassword() dengan NULLatau ""kata sandi:

// Opens an encrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword");
cnn.Open();
// Removes the encryption on an encrypted database.
cnn.ChangePassword(null);

Untuk membuka database terenkripsi yang ada, atau untuk membuat database terenkripsi baru, tentukan kata sandi ConnectionStringseperti yang diperlihatkan di contoh sebelumnya, atau panggil SetPassword()fungsi sebelum membuka yang baru SQLiteConnection. Kata sandi yang ditentukan dalam ConnectionStringharus cleartext, tetapi kata sandi yang disediakan dalam SetPassword()fungsi mungkin array byte biner.

// Opens an encrypted database by calling SetPassword()
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 });
cnn.Open();
// The connection is now usable

Secara default, kata kunci Lampirkan akan menggunakan kunci enkripsi yang sama seperti database utama saat melampirkan file database lain ke koneksi yang ada. Untuk mengubah perilaku ini, Anda menggunakan pengubah tombol sebagai berikut:

Jika Anda melampirkan database terenkripsi menggunakan kata sandi cleartext:

// Attach to a database using a different key than the main database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY 'mypassword'", cnn);
cmd.ExecuteNonQuery();

Untuk melampirkan database terenkripsi menggunakan kata sandi biner:

// Attach to a database encrypted with a binary key
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn);
cmd.ExecuteNonQuery();
Liron Levi
sumber
2
Link-only-answer ini sebenarnya adalah contoh yang jelas mengapa kami tidak melakukan jawaban link-only di SO. Tautan yang sebenarnya hilang; itu tidak ada lagi. Satu-satunya alasan kami dapat melihat situs ini adalah karena secara otomatis diarsipkan oleh web.archive.org.
Hanlet Escaño
Itu tidak berfungsi lagi, tidak ada fungsi seperti itu yang ditemukan di versi terbaru.
MindRoasterMir
12

Gunakan SQLCipher, ini adalah ekstensi sumber terbuka untuk SQLite yang menyediakan enkripsi AES 256-bit transparan dari file database. http://sqlcipher.net

Avdaff
sumber
2
Bagaimana dengan kecepatan? Jika saya menggunakan sqlcipher apakah itu akan mengurangi kinerja?
TomSawyer
6

Anda dapat mengenkripsi database SQLite Anda dengan addon LIHAT. Dengan cara ini Anda mencegah akses / modifikasi yang tidak sah.

Mengutip dokumentasi SQLite:

Ekstensi Enkripsi SQLite (SEE) adalah versi SQLite yang disempurnakan yang mengenkripsi file database menggunakan AES 128-bit atau 256-Bit untuk membantu mencegah akses atau modifikasi yang tidak sah. Seluruh file database dienkripsi sehingga bagi pengamat luar, file database tampaknya mengandung white noise. Tidak ada yang mengidentifikasi file sebagai database SQLite.

Anda dapat menemukan info lebih lanjut tentang addon ini di tautan ini .

rogeriopvl
sumber
7
ekstensi itu juga merupakan addon berbayar untuk sqlite.
John Boker
3

Salah satu opsinya adalah VistaDB . Mereka memungkinkan database (atau bahkan tabel) untuk dilindungi kata sandi (dan secara opsional dienkripsi).

Reed Copsey
sumber
1
Ada cara yang lebih efisien dan gratis!
Sawan
1
@ MSS Tapi - seperti yang saya katakan, solusi VistaDB memang memiliki beberapa keuntungan, termasuk enkripsi terpisah pada tingkat tabel daripada enkripsi koneksi DB penuh. Saya tahu tidak ada opsi asli .NET lain yang menyelesaikan ini. Ini juga dikelola murni, tidak seperti kebanyakan opsi lain - hanya karena tidak gratis bukan berarti ada opsi yang lebih efisien atau lebih baik - itu sepenuhnya tergantung pada persyaratan penggunaan.
Reed Copsey
3

Jika Anda menggunakan FluentNHibernate, Anda dapat menggunakan kode konfigurasi berikut:

private ISessionFactory createSessionFactory()
{
    return Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.UsingFileWithPassword(filename, password))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<DBManager>())
            .ExposeConfiguration(this.buildSchema)
            .BuildSessionFactory();    
}

private void buildSchema(Configuration config)
{
        if (filename_not_exists == true)
        {
            new SchemaExport(config).Create(false, true);
        }
}    

Metode UsingFileWithPassword (nama file, kata sandi) mengenkripsi file database dan menyetel kata sandi.
Ini berjalan hanya jika file database baru dibuat. Yang lama tidak dienkripsi gagal saat dibuka dengan metode ini.

Bronek
sumber
2

Saya tahu ini adalah pertanyaan lama tetapi bukankah solusi sederhananya adalah dengan hanya melindungi file di tingkat OS? Cegah saja pengguna untuk mengakses file dan kemudian mereka tidak dapat menyentuhnya. Ini hanya tebakan dan saya tidak yakin apakah ini solusi yang ideal.

David Price
sumber
2
Saya tidak yakin apakah itu solusi yang baik karena siapa pun yang memiliki stik USB dapat mem-boot ke OS lain dan membaca file.
nurettin
Saya pikir itu adil, tetapi kemudian dalam hal ini nonaktifkan USB. Jika beberapa memiliki akses fisik ke mesin Anda, ada banyak hal lain yang dapat dilakukan.
David Price
Anda ingin melindungi data sensitif sehingga hanya hal-hal lain yang salah.
tripleee
Dengan database SQLite, ini sebenarnya TIDAK mungkin dilakukan sama sekali. Anda membutuhkan pengguna untuk dapat membaca DAN menulis padanya, yang berarti ACL dari folder tempat DB SQLite berada harus mengizinkan mereka juga izin tersebut. Anda dapat mengamankannya dari non-pengguna dengan hanya mengizinkan izin pengguna yang sebenarnya ke folder itu, tetapi Anda masih memiliki "ancaman orang dalam".
vapcguy
1

Mengapa Anda perlu mengenkripsi database? Pengguna dapat dengan mudah membongkar program Anda dan mengetahui kuncinya. Jika Anda mengenkripsinya untuk transfer jaringan, pertimbangkan untuk menggunakan PGP daripada memasukkan lapisan enkripsi ke dalam lapisan database.

Trever Fischer
sumber
6
Pengguna dapat dimintai kata sandi saat memulai sehingga tidak ada kunci yang dapat dicapai dengan membongkar program.
kgadek
1
Gunakan Redgate Reflector, atau ILSpy.
Zev Spitz
4
Mengapa Anda memasukkan kunci ke dalam program? Anda tidak akan melakukannya, buat kunci dari kata sandi pengguna dan gunakan itu, lalu Anda tidak memerlukan rahasia apa pun dalam kode sumber Anda.
pelacur