SQLite com criptografia / proteção por senha

Eu estou apenas aprendendo a usar o SQLite e fiquei curioso para saber se isso é possível:

  1. Criptografia do arquivo de database?

  2. Senha protege a abertura do database?

PS. Eu sei que existe esse “SQLE Encryption Extension (SEE).”, Mas de acordo com a documentação, “O SEE é um software licenciado ….” e “O custo de uma licença de código fonte perpétuo para o SEE é de US $ 2000”.

O SQLite tem ganchos embutidos para criptografia que não são usados ​​na distribuição normal, mas aqui estão algumas implementações que eu conheço:

  • VER – A implementação oficial.
  • wxSQLite – Um wrapper C ++ estilo wxWidgets que também implementa a criptografia do SQLite.
  • SQLCipher – Usa o libcrypto do openSSL para implementar.
  • SQLiteCrypt – Implementação customizada, API modificada.
  • botansqlite3 – botansqlite3 é um codec de criptografia para SQLite3 que pode usar qualquer algoritmo no Botan para criptografia.
  • SQLiteCrypto – SQLiteCrypto é a maneira mais fácil de criptografar database Sqlite por AES-256 e SHA-256

O SEE, SQLiteCrypt e SQLiteCrypto requerem a compra de uma licença.

Divulgação: eu criei botansqlite3.

Você pode proteger com senha o SQLite3 DB. Pela primeira vez antes de fazer qualquer operação, defina a senha da seguinte maneira.

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

então da próxima vez você pode acessá-lo como

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

Isso não permitirá que qualquer editor de GUI visualize seus dados. Mais tarde, se você quiser alterar a senha, use conn.ChangePassword("new_password"); Para redefinir ou remover a senha, use conn.ChangePassword(String.Empty);

A biblioteca .net System.Data.SQLite também fornece criptografia.

Você pode obter o arquivo sqlite3.dll com suporte a criptografia em http://system.data.sqlite.org/ .

1 – Vá para http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki e baixe um dos pacotes. A versão .NET é irrelevante aqui.

2 – Extraia o SQLite.Interop.dll do pacote e renomeie-o para sqlite3.dll . Essa DLL oferece suporte à criptografia por meio de senhas de texto sem formatação ou chaves de criptografia.

O arquivo mencionado é nativo e NÃO requer o .NET framework. Pode precisar do Visual C ++ Runtime, dependendo do pacote que você baixou.

ATUALIZAR

Este é o pacote que baixei para o desenvolvimento de 32 bits: http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip

É certamente possível e existem várias soluções de código aberto além do SEE. Entre eles, a extensão de criptografia que vem com o wxSQLite3. Veja minha resposta para uma pergunta semelhante para detalhes.

Tenha em mente que o seguinte não se destina a ser um substituto para uma solução de segurança adequada.

Depois de brincar com isso por quatro dias, criei uma solução usando apenas o pacote System.Data.SQLite de código aberto do NuGet. Eu não sei quanta proteção isso oferece. Eu só estou usando para o meu próprio curso de estudo. Isso criará o database, criptografará, criará uma tabela e adicionará dados.

 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, você pode remover conn.SetPassword(passwordBytes); e substitua por conn.ChangePassword("password"); que precisa ser colocado após conn.Open(); em vez de antes. Então você não precisará do método GetBytes.

Para descriptografar, é apenas uma questão de colocar a senha na sua string de conexão antes da chamada para abrir.

  string filename = @"C:\Programming\sqlite3\db.db"; string passwordString = "password"; SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";"); conn.Open(); 

Você sempre pode criptografar dados no lado do cliente. Observe que nem todos os dados precisam ser criptografados porque têm um problema de desempenho.

Bem, o SEE é caro. No entanto SQLite tem interface embutida para criptografia (Pager). Isso significa que, além do código existente, é possível desenvolver facilmente algum mecanismo de criptografia, não é necessário que seja o AES . Qualquer coisa, mesmo. Por favor, veja o meu post aqui: https://stackoverflow.com/a/49161716/9418360

Você precisa definir SQLITE_HAS_CODEC = 1 para ativar a criptografia do Pager. Exemplo de código abaixo (fonte original do SQLite ):

 #ifdef SQLITE_HAS_CODEC /* ** This function is called by the wal module when writing page content ** into the log file. ** ** This function returns a pointer to a buffer containing the encrypted ** page content. If a malloc fails, this function may return NULL. */ SQLITE_PRIVATE void *sqlite3PagerCodec(PgHdr *pPg){ void *aData = 0; CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData); return aData; } #endif 

Existe uma versão comercial em C language para criptografia SQLite usando AES256 – ele também pode trabalhar com PHP , mas precisa ser compilado com extensão PHP e SQLite . Ele / criptografa o arquivo de SQLite dados SQLite em tempo real, o conteúdo do arquivo é sempre criptografado. Muito útil.

http://www.iqx7.com/products/sqlite-encryption

Você pode usar as rotinas de criação de function do SQLite ( manual do PHP ):

 $db_obj->sqliteCreateFunction('Encrypt', 'MyEncryptFunction', 2); $db_obj->sqliteCreateFunction('Decrypt', 'MyDecryptFunction', 2); 

Ao inserir dados, você pode usar a function de criptografia diretamente e INSERIR os dados criptografados ou pode usar a function personalizada e passar dados não criptografados:

 $insert_obj = $db_obj->prepare('INSERT INTO table (Clear, Encrypted) ' . 'VALUES (:clear, Encrypt(:data, "' . $passwordhash_str . '"))'); 

Ao recuperar dados, você também pode usar a funcionalidade de pesquisa do SQL:

 $select_obj = $db_obj->prepare('SELECT Clear, ' . 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' . 'WHERE PlainText LIKE :searchterm'); 

Sim é possivel. Se a segmentação .Net Standard 4.6.1+ ou Core, eu acho um bastante simples para obter criptografia Sqlite é usar Microsoft.Data.Sqlite por minha resposta aqui .

Para projetos que usam Javascript, o pacote escrito por journeyapps funciona perfeitamente.

https://github.com/journeyapps/node-sqlcipher

Ele trabalhou no Mac / Windows / Linux para mim. Compila o SQLCipher na sua plataforma. Não há necessidade de pagar pelas licenças da Zetetic.