2010-04-03 26 views
9

Aquí está el problema: En mi proyecto Qt4.6, utilizo una base de datos SQLite. Esta base de datos no debe estar desencriptada en mi disco duro. Así que quiero que en cada inicio de mi programa, se le pida al usuario que ingrese una contraseña para descifrar la base de datos. Por supuesto, la base de datos nunca debería aparecer "en claro" (no encriptada) en mi disco duro.
¿Hay alguna posibilidad de descifrar una base de datos SQLite "sobre la marcha" y leer y escribir datos? ¿Qué algoritmo es el mejor (quizás AES)?
Cuando no es posible (o muy lento), quizás sea mejor encriptar cada cadena en la base de datos y descifrarla cuando la contraseña sea correcta (para que un usuario pueda abrir la base de datos, pero no tiene idea de qué podrían hacer media)?Encriptar/Descifrar base de datos SQLite y usarlo "sobre la marcha"

Respuesta

11

No hay soporte integrado, por lo que se dice que usted tiene opciones.

1) Puede encriptar/desencriptar todas sus cadenas, pero esto es mucho trabajo, no es transparente y no le permitirá hacer cosas como buscar en la base de datos.

2) SQLiteCrypt y SQLCipher hagan lo que usted está buscando.

Puede usarlos casi completamente transparentes y, por lo general, se dice que tienen solo un 5% de gastos generales comparados sin cifrado.

+0

pero cuando uso una API diferente, ya no tengo la "usabilidad" de Qt y SQLite, ¿verdad? – Berschi

+1

@Berschi: Probablemente tendrías que reconstruir el componente sqlite en Qt pero proporcionan la fuente para necesidades como esta. Creo que intentar usar uno de estos componentes será tu mejor opción. –

+0

Debería poder usar el controlador sqlite y compilarlo contra el sqllite proporcionado por SqlLitCrypt o SQLCipher. Probablemente podría incorporar parte de la facilidad de la contraseña en la cadena de conexión, o extender la clase de controlador y llamar al controlador directamente para las funciones extendidas –

2

Lo mejor que puedo pensar es usar FUSE - "filesystems in user-land" - disponible para Linux, Mac OS X y otros sistemas, o un sistema de archivos encriptado diferente. Esto hará que SQLite lo vea como desencriptado mientras está encriptado físicamente en el disco. Al jugar con los permisos, puede asegurarse de que las personas no puedan acceder al sistema de archivos no cifrado.

No estoy seguro de si SQLite tiene una forma de sobrepasar las rutinas de lectura/escritura de bajo nivel que le permitirán implementar el cifrado sobre la marcha sin juegos de sistema de archivos. Al menos nunca tuve que hacer eso. Es posible que desee buscar dicha solicitud de función y archivarla si no está en el rastreador de problemas de SQLite.

1

Una opción adicional sería el códec de cifrado SQLite que viene con Botan 1.9.x (src/wrap/sqlite).

Esa opción le da la posibilidad de personalizar el tipo de cifrado en tiempo de compilación, incluido el cifrado y el modo.

Divulgación: contribuí con el códec a Botan.

Cuestiones relacionadas