2009-06-12 40 views
5

Tengo un sqlite3 db en el que inserto/selecciono en python. La aplicación funciona muy bien pero quiero modificarla para que nadie pueda leer desde el DB sin una contraseña. ¿Cómo puedo hacer esto en Python? tenga en cuenta que no tengo idea de dónde comenzar.Archivo cifrado o db en python

Respuesta

1

Las bases de datos SQLite son bastante legibles, y no hay ningún cifrado incorporado.

¿Le preocupa que alguien acceda y lea los archivos de la base de datos directamente, o acceda a ellos a través de su programa?

Supongo que lo primero, porque este último no está realmente relacionado con la base de datos, es la seguridad de su aplicación la que está preguntando.

Unas pocas opciones vienen a la mente:

  1. proteger la db con permisos de acceso a archivos en vez de cifrado. No ha mencionado cuál es su entorno, por lo que no puedo decir si esto es factible para usted o no, pero es probablemente la manera más simple y confiable, ya que no puede intentar descifrar lo que no puede leer.
  2. Encripte en Python antes de escribir y descifre en Python después de leer. Bastante simple, pero se pierde la mayor parte de la potencia de las operaciones de ajuste basadas en conjuntos de SQL.
  3. Cambiar a otra base de datos; la autenticación de usuario y los permisos son características estándar de la mayoría de las bases de datos de múltiples usuarios. Cuando te encuentras frente a las limitaciones de una herramienta, puede ser más fácil buscar otras herramientas en lugar de hackear nuevas funciones en la herramienta actual.
+0

Tengo la misma pregunta, excepto que no puedo usar otras bases de datos porque sqlite es liviano para una aplicación de escritorio Estoy intentando escribir (un software de diario privado) –

9

Puede usar SQLCipher.

http://sqlcipher.net/

Open Source cifrado de base de datos completa para SQLite

SQLCipher es una extensión SQLite transparente que proporciona cifrado AES de 256 bits de los archivos de base de datos. Las páginas se cifran antes de escribirse en el disco y se descifran cuando se vuelven a leer. Debido a su pequeño tamaño y gran rendimiento, es ideal para proteger bases de datos de aplicaciones integradas y es ideal para el desarrollo móvil.

  1. rendimiento ultrarrápido con tan poco como 5-15% de gastos generales para cifrado en muchas operaciones
  2. 100% de los datos en el archivo de base de datos está cifrada Usos buena seguridad prácticas (modo CBC, la derivación de claves)
  3. cero-configuración y aplicación de nivel criptografía amplia plataforma
  4. apoyo: trabaja con C/C++, Obj-C, QT, Win32/.NET, Java, Python, Ruby, etc en Windows, Linux, iPhone/iOS ...
+6

¿cómo exactamente se puede obtener? trabajar desde Python? – Michael

1

Tuve el mismo problema. Mi aplicación puede tener varias instancias ejecutándose al mismo tiempo. Debido a esto, no puedo encriptar el archivo sqlite db y terminarlo. Tampoco creo que encriptar los datos en python sea una buena idea, ya que no se puede manipular seriamente la base de datos en este estado.

Con estas limitaciones en mente, me han llegado con las dos soluciones siguientes:

1) Utilizar los antes mencionados SQLCipher. Los problemas que veo aquí son que tendré que escribir mis propios enlaces para Python y compilarlo yo mismo (o pagar la tarifa). Podría hacer esto en cualquier caso, ya que sería una gran solución para otros desarrolladores de Python. Si tengo éxito, publicaré con la solución.

2) Si la opción 1 es demasiado difícil para mí o demasiado lenta, usaré este método. Este método no es tan seguro. Usaré pycrypto para encriptar el archivo de la base de datos. Implementaré un "servidor" de SQL que descifrará el archivo de la base de datos y luego manejará las solicitudes de varios clientes. Cuando no haya solicitudes pendientes, volverá a cifrar la base de datos. Esto será más lento, sobre todo, y dejará la base de datos en estados descifrados temporales.

Espero que estas ideas ayuden al siguiente tipo.

EDITAR 1/13/2013

me di por vencido en SQLCipher porque yo no era capaz de conseguir que se compile y el código base está tratando de usar OpenSSL, que mientras que una biblioteca de sonidos, es bastante masiva de una base de código para AES 128 simple.

Encontré otra opción wxSQLite3, y descubrí cómo separar solo la pieza de cifrado SQLite: https://github.com/shenghe/FreeSQLiteEncryption. Pude hacer esto para compilar y trabajar (con la última versión de SQLite3). wxSQLite3 también es compatible con AES 256, que es realmente genial. Mi siguiente paso será intentar compilar pysqlite (que es la biblioteca sqlite que viene incorporada en python) con el sqlite3.dll modificado. Si eso funciona, modificaré pysqlite para que admita la pieza de cifrado ampliada de sqlite3.dll de wxSQLite3. En cualquier caso, intentaré actualizar este hilo con mis resultados, y si tiene éxito, publicaré la base de código final, con instrucciones de compilación, en Github.

+0

actualizaciones sobre esto? – Thomas

+0

Desafortunadamente, el proyecto fracasó y nunca volví a hacerlo. – shellster

2

Como Frontware sugiere, puede usar sqlcipher.

pysqlcipher paquete python puede hacer que sea más fácil de usar ya que utiliza la amalgamación de código sqlcipher para compilar la extensión.

Debería ser solo una cuestión de usar pysqlcipher como lo haría con sqlite.dbapi2 regular, simplemente configurando los cripto pragmas correctos.