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

88

Tengo que afrontar un pequeño proyecto nuevo. Tendrá alrededor de 7 o 9 tablas, la mayor de ellas crecerá a una tasa máxima de 1000 filas por mes.

Pensé en SQLite como mi base de datos ... Pero tendré que proteger la base de datos en caso de que alguien quiera cambiar los datos de la base de datos

Mi pregunta principal es:

¿Es posible proteger con contraseña una base de datos sqlite como lo haría al acceder?

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

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

Jhonny D. Cano -Leftware-
fuente
2
Es posible que desee consultar SQLiteCrypt
Mike Buckbee
Si necesita bloquear / desbloquear DB con frecuencia para la depuración, pruebe esta herramienta goo.gl/12VnQd
Mangesh
Puede encontrar la solución aquí ingrese la descripción del enlace aquí
Ishwar Rimal
Posible duplicado de SQLite con cifrado / protección de contraseña
iammilind

Respuestas:

73

Puede proteger con contraseña una base de datos SQLite3. 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 podrás acceder a él como

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

Esto no permitirá que ningún editor de GUI vea sus datos. Algunos editores pueden descifrar la base de datos si proporciona la contraseña. El algoritmo utilizado es RSA.

Más tarde, si desea cambiar la contraseña, utilice

conn.ChangePassword("new_password");

Para restablecer o eliminar la contraseña, utilice

conn.ChangePassword(String.Empty);
Mangesh
fuente
La única herramienta gratuita que he encontrado hasta ahora que abre bases de datos protegidas con contraseña como esta es SQLite2009 Pro que se detalla en esta respuesta .
JumpingJezza
¿Qué idioma es este ejemplo? ¿Parece .NET?
pim
1
Técnicamente, .NET es framework. C # es el idioma que se muestra aquí.
vapcguy
Además, debe tener cuidado al actualizar la cadena de conexión antes de la próxima apertura cada vez que cambie la contraseña o puede terminar enfrentando errores: stackoverflow.com/questions/16030601/…
vapcguy
Observe que, sin una contraseña proporcionada, Open () NO fallará en una base de datos SQLite protegida con contraseña, como es de esperar. Lo que falla es cualquier operación posterior de datos o metadatos en ese archivo abierto.
Cristi S.
33

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

Para cifrar una base de datos no cifrada existente , o para cambiar la contraseña de una base de datos cifrada , 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 llamada de base de datos cifrada existenteChangePassword() con una contraseña NULLo "":

// 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 para crear una nueva base de datos cifrada, especifique una contraseña ConnectionStringcomo se muestra en el ejemplo anterior, o llame a la SetPassword()función antes de abrir una nueva SQLiteConnection. Las contraseñas especificadas en el ConnectionStringdeben ser texto sin cifrar, pero las contraseñas proporcionadas en la SetPassword()función 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 utilizará 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 con una contraseña de texto sin cifrar:

// 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 encriptada 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();
Liron Levi
fuente
2
Esta respuesta de solo enlace es de hecho un claro ejemplo de por qué no hacemos respuestas de solo enlace en SO. El vínculo real se ha ido; ya no existe. La única razón por la que podemos ver el sitio es porque web.archive.org lo archivó automáticamente.
Hanlet Escaño
Ya no funciona, no se encuentran tales funciones en las últimas versiones.
MindRoasterMir
12

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

Avdaff
fuente
1
¿Qué tal la velocidad? Si utilizo sqlcipher, ¿reducirá el rendimiento?
TomSawyer
6

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

Citando la documentación de SQLite:

SQLite Encryption Extension (SEE) es una versión mejorada de SQLite que cifra los archivos de la base de datos utilizando AES de 128 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 para que, para un observador externo, el archivo de la base de datos parezca 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 .

rogeriopvl
fuente
7
esa extensión también es un complemento pagado para sqlite.
John Boker
3

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

Reed Copsey
fuente
1
¡Hay formas más eficientes y gratuitas!
Sawan
1
@MSS Pero, como dije, la solución VistaDB tiene algunas ventajas, incluido el cifrado por separado a nivel de tabla en lugar del cifrado de conexión de base de datos completo. No conozco ninguna otra opción nativa de .NET que logre esto. También se administra de forma pura, a diferencia de la mayoría de las otras opciones, solo porque no es gratis no significa que haya opciones más eficientes o mejores, depende completamente de los requisitos de uso.
Reed Copsey
3

para su pregunta sobre la protección con contraseña de su base de datos sqlite, no creo que se pueda hacer.

Sin embargo, puede cifrarlo, aquí hay algo de información al respecto:

http://sqlcrypt.com/

son $ 149 por plataforma.

John Boker
fuente
3

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<DBManager>())
            .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) cifra un archivo de base de datos y establece la contraseña.
Solo se ejecuta si se crea el nuevo archivo de base de datos. El antiguo no cifrado falla cuando se abre con este método.

Bronek
fuente
2

Sé que esta es una pregunta antigua, pero ¿no sería la solución simple proteger el archivo a nivel del sistema operativo? Simplemente evite que los usuarios accedan al archivo y luego no deberían poder tocarlo. Esto es solo una suposición y no estoy seguro de si es una solución ideal.

Precio de David
fuente
2
No estoy seguro de si esa es una buena solución porque cualquiera con una memoria USB podría iniciar en otro sistema operativo y leer los archivos.
nurettin
Creo que es justo señalarlo, pero luego, en ese caso, desactive el USB. Si alguien tiene acceso físico a su máquina, hay muchas otras cosas que se pueden hacer.
David Price
Desea proteger los datos confidenciales para que solo esas otras cosas salgan mal.
tripleee
Con la base de datos SQLite, esto NO es posible en absoluto. Necesita que los usuarios puedan leer Y escribir en él, lo que significa que la ACL de la carpeta donde vive la base de datos SQLite debe permitirles esos permisos también. Puede protegerlo contra los no usuarios permitiendo solo el permiso de los usuarios reales a esa carpeta, pero aún tiene la "amenaza interna".
vapcguy
1

¿Por qué necesita cifrar la base de datos? El usuario podría desmontar fácilmente su programa y averiguar la clave. Si lo está cifrando para la transferencia de red, considere usar PGP en lugar de comprimir una capa de cifrado en una capa de base de datos.

Trever Fischer
fuente
6
Es posible que se le solicite al usuario una contraseña al iniciar, de modo que no se pueda obtener ninguna clave desmontando el programa.
kgadek
1
Utilice Redgate Reflector o ILSpy.
Zev Spitz
4
¿Por qué pondrías la llave en el programa? no haría eso, generaría una clave a partir de la contraseña de los usuarios y la usaría, entonces no necesitaría ningún secreto en su código fuente.
Trampster