Tenga en cuenta que lo siguiente no pretende ser un sustituto de una solución de seguridad adecuada.
Después de jugar con esto durante cuatro días, armé una solución usando solo el paquete de código abierto System.Data.SQLite de NuGet. No sé cuánta protección proporciona esto. Solo lo estoy usando para mi propio curso de estudio. Esto creará la base de datos, la encriptará, creará una tabla y agregará datos.
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;
}
}
}
Opcionalmente, puede eliminarlo conn.SetPassword(passwordBytes);
y reemplazarlo con el conn.ChangePassword("password");
que debe colocarse después en conn.Open();
lugar de antes. Entonces no necesitará el método GetBytes.
Para descifrar, solo es cuestión de poner la contraseña en su cadena de conexión antes de que se abra la llamada.
string filename = @"C:\Programming\sqlite3\db.db";
string passwordString = "password";
SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
conn.Open();