desencriptar - Archivo cifrado o db en python
encriptar codigo python (5)
Tengo un sqlite3 db del cual 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 empezar.
Las bases de datos SQLite son legibles por humanos, 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?
Estoy asumiendo 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.
Algunas opciones vienen a la mente:
- Proteja la base de datos con los permisos del sistema de archivos en lugar de la encriptación. 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.
- Cifre 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.
- 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.
Una lista de ejemplos de encriptación Python .
Puedes usar SQLCipher.
Cifrado de base de datos completo de código abierto para SQLite
SQLCipher es una extensión de SQLite que proporciona cifrado AES transparente de 256 bits de 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.
- Rendimiento increíblemente rápido con tan solo un 5-15% de sobrecarga para cifrado en muchas operaciones
- 100% de los datos en el archivo de base de datos está encriptado. Utiliza buenas prácticas de seguridad (modo CBC, derivación de clave)
- Zero-configuración y nivel de aplicación criptografía Plataforma amplia
- soporte: funciona con C / C ++, Obj-C, QT, Win32 / .NET, Java, Python, Ruby, etc. en Windows, Linux, iPhone / iOS ...
Yo 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 esas restricciones en mente, he encontrado las siguientes dos soluciones:
1) Use el SQLCipher antes mencionado. 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 consume mucho tiempo, 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 próximo tipo.
EDITAR 13/01/2013
Renuncié a SQLCipher porque parecía que no podía compilarlo, y la base de código está tratando de usar OpenSSL, que si bien es una biblioteca de sonidos, es bastante masiva de una base de código para el simple AES 128.
Encontré otra opción wxSQLite3, y descubrí cómo separar solo el fragmento 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.
Como Frontware sugiere, puedes usar sqlcipher.
El paquete pysqlcipher python puede hacer que sea más fácil de usar ya que usa 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.