Hãy ghi nhớ, những điều sau đây không nhằm mục đích thay thế cho một giải pháp bảo mật thích hợp.
Sau khi chơi xung quanh vấn đề này trong bốn ngày, tôi đã đưa ra một giải pháp chỉ sử dụng gói System.Data.SQLite nguồn mở từ NuGet. Tôi không biết bao nhiêu sự bảo vệ này cung cấp. Tôi chỉ sử dụng nó cho khóa học của riêng tôi. Điều này sẽ tạo DB, mã hóa nó, tạo bảng và thêm dữ liệu.
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;
}
}
}
Tùy chọn, bạn có thể loại bỏ conn.SetPassword(passwordBytes);
và thay thế nó bằng conn.ChangePassword("password");
cái cần đặt sau conn.Open();
thay vì trước. Sau đó, bạn sẽ không cần phương thức GetBytes.
Để giải mã, vấn đề chỉ là đặt mật khẩu trong chuỗi kết nối của bạn trước khi cuộc gọi mở.
string filename = @"C:\Programming\sqlite3\db.db";
string passwordString = "password";
SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
conn.Open();