SQLite con protección de cifrado / contraseña

Estoy aprendiendo a usar SQLite y tenía curiosidad si eso es posible:

  1. Cifrado del archivo de base de datos?

  2. La contraseña protege la apertura de la base de datos?

PD. Sé que existe esta “Extensión de cifrado SQLite (SEE).”, Pero de acuerdo con la documentación, “El SEE es un software con licencia ….” y “El costo de una licencia de código fuente perpetuo para SEE es de US $ 2000”.

SQLite tiene ganchos incorporados para el cifrado que no se usan en la distribución normal, pero aquí hay algunas implementaciones que conozco:

  • VER – La implementación oficial.
  • wxSQLite – Un contenedor de C ++ estilo wxWidgets que también implementa el cifrado de SQLite.
  • SQLCipher : utiliza el libcrypto de openSSL para implementar.
  • SQLiteCrypt – Implementación personalizada, API modificada.
  • botansqlite3 – botansqlite3 es un códec de cifrado para SQLite3 que puede usar cualquier algoritmo en Botan para el cifrado.
  • SQLiteCrypto – SQLiteCrypto es la forma más fácil de cifrar la base de datos Sqlite por AES-256 y SHA-256

El SEE, SQLiteCrypt y SQLiteCrypto requieren la compra de una licencia.

Divulgación: Creé botansqlite3.

Puede proteger con contraseña SQLite3 DB. Por primera vez antes de realizar cualquier operación, configure la contraseña de la siguiente manera.

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

entonces la próxima vez puedes acceder como

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

Esto no permitirá que ningún editor GUI vea Tus datos. Más tarde, si desea cambiar la contraseña, use conn.ChangePassword("new_password"); Para restablecer o eliminar la contraseña, use conn.ChangePassword(String.Empty);

La biblioteca .net System.Data.SQLite también proporciona cifrado.

Puede obtener el archivo sqlite3.dll con soporte de encriptación desde http://system.data.sqlite.org/ .

1 – Vaya a http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki y descargue uno de los paquetes. La versión .NET es irrelevante aquí.

2 – Extraiga SQLite.Interop.dll del paquete y cambie el nombre a sqlite3.dll . Esta DLL admite el cifrado mediante contraseñas de texto plano o claves de cifrado.

El archivo mencionado es nativo y NO requiere .NET framework. Puede necesitar Visual C ++ Runtime dependiendo del paquete que haya descargado.

ACTUALIZAR

Este es el paquete que he descargado para el desarrollo de 32 bits: http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip

Ciertamente es posible y existen varias soluciones de código abierto además de SEE. Entre ellos, la extensión de cifrado que viene con wxSQLite3. Vea mi respuesta a una pregunta similar para más detalles.

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, he creado una solución utilizando 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 eliminar conn.SetPassword(passwordBytes); y reemplácelo con conn.ChangePassword("password"); que debe colocarse después de conn.Open(); en lugar de antes Entonces no necesitarás 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(); 

Siempre puede cifrar datos en el lado del cliente. Tenga en cuenta que no todos los datos tienen que estar encriptados porque tienen un problema de rendimiento.

Bueno, SEE es caro. Sin embargo, SQLite tiene una interfaz incorporada para encriptación (buscapersonas). Esto significa que, además del código existente, uno puede desarrollar fácilmente algún mecanismo de cifrado, no tiene que ser AES . Cualquier cosa en realidad. Por favor, mira mi publicación aquí: https://stackoverflow.com/a/49161716/9418360

Debe definir SQLITE_HAS_CODEC = 1 para habilitar el cifrado de buscapersonas. Código de muestra a continuación (origen original de 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 una versión comercial en C language para cifrado SQLite utilizando AES256; también puede funcionar con PHP , pero debe comstackrse con extensión PHP y SQLite . De / cifra el archivo de SQLite datos SQLite sobre la marcha, los contenidos de los archivos siempre están encriptados. Muy útil.

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

Puede usar las rutinas de creación de funciones de SQLite ( manual de PHP ):

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

Al insertar datos, puede usar la función de cifrado directamente e INSERTAR los datos cifrados o puede usar la función personalizada y pasar datos no encriptados:

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

Al recuperar datos, también puede usar la funcionalidad de búsqueda SQL:

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

Si es posible. Si apuntar a .Net Standard 4.6.1+ o Core, creo que una forma bastante sencilla de obtener el cifrado Sqlite es usar Microsoft.Data.Sqlite según mi respuesta aquí .

Para proyectos que usan Javascript, el paquete escrito por journeyapps funciona a la perfección.

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

Funcionó en Mac / Windows / Linux para mí. Comstack SQLCipher en su plataforma. No es necesario pagar las licencias de Zetetic.