Contraseña Proteja una base de datos SQLite. ¿Es posible?

Tengo que enfrentar un nuevo pequeño proyecto. Tendrá alrededor de 7 o 9 tablas, la más grande crecerá en una tasa máxima de 1000 filas por mes.

Pensé en SQLite como mi DB … Pero tendré que proteger el DB en caso de que alguien quiera cambiar los datos del DB

Mi pregunta principal es:

¿Es posible proteger con contraseña una sqlite db como lo haría con el acceso?

¿Qué otro RDBMS recomendaría para una solución tan pequeña?

El desarrollo sería en C #, pero estoy buscando algo gratis.

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. Algunos editores pueden descifrar el DB si proporciona la contraseña. El algoritmo utilizado es RSA.

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); 

Puede utilizar el cifrado integrado del proveedor sqlite .net (System.Data.SQLite). Ver más detalles en http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx

Para encriptar una base de datos sin encriptar existente , o para cambiar la contraseña de una base de datos encriptada , abra la base de datos y luego use la función ChangePassword () de SQLiteConnection:

 // Opens an unencrypted database SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3"); cnn.Open(); // Encrypts the database. The connection remains valid and usable afterwards. cnn.ChangePassword("mypassword"); 

Para descifrar una base de datos cifrada existente, llame a ChangePassword() con una contraseña NULL o "" :

 // Opens an encrypted database SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword"); cnn.Open(); // Removes the encryption on an encrypted database. cnn.ChangePassword(null); 

Para abrir una base de datos cifrada existente o crear una nueva base de datos cifrada, especifique una contraseña en ConnectionString como se muestra en el ejemplo anterior, o llame a la función SetPassword() antes de abrir una nueva SQLiteConnection . Las contraseñas especificadas en ConnectionString deben ser texto claro, pero las contraseñas suministradas en la función SetPassword() pueden ser matrices de bytes binarios.

 // Opens an encrypted database by calling SetPassword() SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3"); cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 }); cnn.Open(); // The connection is now usable 

De forma predeterminada, la palabra clave ATTACH usará la misma clave de cifrado que la base de datos principal al adjuntar otro archivo de base de datos a una conexión existente. Para cambiar este comportamiento, use el modificador KEY de la siguiente manera:

Si está adjuntando una base de datos cifrada usando una contraseña clara:

 // Attach to a database using a different key than the main database SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3"); cnn.Open(); cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY 'mypassword'", cnn); cmd.ExecuteNonQuery(); 

Para adjuntar una base de datos cifrada usando una contraseña binaria:

 // Attach to a database encrypted with a binary key SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3"); cnn.Open(); cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn); cmd.ExecuteNonQuery(); 

Use SQLCipher, es una extensión de código abierto para SQLite que proporciona cifrado AES transparente de 256 bits de archivos de base de datos. http://sqlcipher.net

Puede encriptar su base de datos SQLite con el complemento SEE. De esta forma, evita el acceso / modificación no autorizado.

Citando la documentación de SQLite:

La SQLite Encryption Extension (SEE) es una versión mejorada de SQLite que encripta los archivos de la base de datos utilizando AES de 128 bits o 256 bits para ayudar a prevenir el acceso o la modificación no autorizados. Todo el archivo de la base de datos está encriptado, de modo que para un observador externo, el archivo de la base de datos parece contener ruido blanco. No hay nada que identifique el archivo como una base de datos SQLite.

Puede encontrar más información sobre este complemento en este enlace .

para su pregunta sobre la contraseña que protege su sqlite db, no creo que se pueda hacer.

sin embargo, puedes encriptarlo, aquí hay información sobre eso:

http://sqlcrypt.com/

es $ 149 por plataforma.

Una opción sería VistaDB . Permiten que las bases de datos (o incluso las tablas) estén protegidas con contraseña (y opcionalmente encriptadas).

Si usa FluentNHibernate , puede usar el siguiente código de configuración:

 private ISessionFactory createSessionFactory() { return Fluently.Configure() .Database(SQLiteConfiguration.Standard.UsingFileWithPassword(filename, password)) .Mappings(m => m.FluentMappings.AddFromAssemblyOf()) .ExposeConfiguration(this.buildSchema) .BuildSessionFactory(); } private void buildSchema(Configuration config) { if (filename_not_exists == true) { new SchemaExport(config).Create(false, true); } } 

El método UsingFileWithPassword (nombre de archivo, contraseña) encripta un archivo de base de datos y establece la contraseña.
Se ejecuta solo si se crea el nuevo archivo de base de datos. El antiguo que no está encriptado falla cuando se abre con este método.

Sé que esta es una vieja pregunta, pero ¿no sería la solución simple simplemente proteger el archivo en el nivel del sistema operativo? Solo evite que los usuarios accedan al archivo y luego no puedan tocarlo. Esto es solo una suposición y no estoy seguro si esta es una solución ideal.

¿Por qué necesitas encriptar la base de datos? El usuario podría desmontar fácilmente su progtwig y descubrir la clave. Si está encriptando para la transferencia de red, considere usar PGP en lugar de exprimir una capa de cifrado en una capa de base de datos.