Tenere presente che quanto segue non intende sostituire una soluzione di sicurezza adeguata.
Dopo aver giocato con questo per quattro giorni, ho messo insieme una soluzione usando solo il pacchetto open source System.Data.SQLite di NuGet. Non so quanta protezione fornisca. Lo sto usando solo per il mio corso di studi. Ciò creerà il DB, lo crittograferà, creerà una tabella e aggiungerà i dati.
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;
}
}
}
Facoltativamente, è possibile rimuoverlo conn.SetPassword(passwordBytes);
e sostituirlo con il conn.ChangePassword("password");
quale deve essere posizionato dopo conn.Open();
anziché prima. Quindi non avrai bisogno del metodo GetBytes.
Per decrittografare, è solo una questione di mettere la password nella stringa di connessione prima di aprire la chiamata.
string filename = @"C:\Programming\sqlite3\db.db";
string passwordString = "password";
SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
conn.Open();