Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add password to Sqlite file in Xamarin forms

I have a Xamarin form application that creates a Sqlite database.

Microsoft.EntityFrameworkCore.Sqlite is used to create the database. I want to add a password to the file. I searched the internet, but unfortunately I can't find any obvious way. On StackOverflow, there are some questions that are similar to my question, however, the platform is not Xamarin Forms.

Here are the questions:

  • Password protected SQLite with Entity Framework Core
  • Cannot provide password in Connection String for SQLite

This is my code for creating the database:

public class DoctorDatabaseContext : DbContext
{
        private readonly string DatabasePath;

        public virtual DbSet<OperationsNames> OperationsNames { get; set; }
        public virtual DbSet<CommonChiefComplaint> CommonChiefComplaint { get; set; }
        public virtual DbSet<CommonDiagnosis> CommonDiagnosis { get; set; }
        public virtual DbSet<CommonLabTests> CommonLabTests { get; set; }

        public DoctorDatabaseContext(string DatabasePath)
        {
            FixedDatabasePath.Path = this.DatabasePath = DatabasePath;

            Database.EnsureCreated();    
        }    

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite($"Filename={DatabasePath}");    
        }
    }
like image 249
Ahmed Shamel Avatar asked Feb 25 '18 17:02

Ahmed Shamel


People also ask

Can I put password on SQLite database?

SQLite doesn't support encrypting database files by default. Instead, you need to use a modified version of SQLite like SEE, SQLCipher, SQLiteCrypt, or wxSQLite3.


1 Answers

I wrote a post on Encryption in Microsoft.Data.Sqlite. You can leverage it in EF Core by passing in an open connection to UseSqlite.

Instead of Microsoft.EntityFrameworkCore.Sqlite, use these packages:

  • Microsoft.EntityFrameworkCore.Sqlite.Core
  • SQLitePCLRaw.bundle_sqlcipher

protected override void OnConfiguring(DbContextOptionsBuilder options)
{
    // TODO: Dispose with DbContext
    _connection = new SqliteConnection(_connectionString);
    _connection.Open();

    // TODO: Avoid SQL injection (see post)
    var command = _connection.CreateCommand();
    command.CommandText = "PRAGMA key = '" + _password + "'";
    command.ExecuteNonQuery();

    options.UseSqlite(_connection);
}
like image 89
bricelam Avatar answered Oct 13 '22 23:10

bricelam