1

SQLite3由于应用程序,我创建了一个数据库并用密码(“测试”)保护它DB browser for SQLite。为了通过 连接到我的数据库Python,我需要提供密码,但我不知道该怎么做。我尝试了以下代码:

conn=sqlite3.connect("mydatabase.db", Password="test")
cur=conn.cursor()

编辑:

我的SQLite3数据库已被加密SQLCipher(见图)。 在此处输入图像描述 如果我运行以下代码:

conn=sqlite3.connect("mydatabase.db")
cur=conn.cursor()

我收到此错误:

sqlite3.DatabaseError: file is encrypted or is not a database

如何传递密码以db通过 Python 与我的连接?

编辑 2

这里简要总结了我试图实现的目标。我正在开发一个Python 3需要预填充数据库的应用程序,但该数据库需要使用密码保护。经过广泛研究,SQLite3通过Python 3. 存在一个库调用pysqlcipher,但仅适用于 Python 2.7。我的下一个问题可能过于笼统,我提前道歉。是否存在另一个便携式数据库,允许我用密码保护它并且仍然可以访问 Python?为了解决我的问题,我想到的另一个想法是使用该zipfile库。此链接提到该zipfile模块不支持加密,但不清楚加密是否指的是SQLite3数据库或压缩文件。这个想法是将我不受DB保护的压缩到一个受保护的压缩文件中,因为我似乎可以做到这一点(链接)。这次编辑的目的是获得关于如何解决我的问题的新想法。谢谢

4

2 回答 2

3

如果您的数据库使用 SqlCipher 加密,则需要在 SO Windows 中安装 sqlcipher:下载

Linux:sudo pacman -S sqlcipher

sudo apt-get install sqlcipher

在您需要 pysqlcipher3 库之后:pip install pysqlcipher3

见:https ://github.com/rigglemania/pysqlcipher3

我的示例代码是:

from pysqlcipher3 import dbapi2 as sqlite3


class Database(object):
    def __init__(self, dbname):
        self.dbname = dbname

    def connDB(self):
        self.conn = sqlite3.connect(self.dbname)
        self.cursor = self.conn.cursor()
        self.cursor.execute("PRAGMA key='mypassword'")

    def createDB(self):
        self.connDB()
        self.cursor.execute(
            '''
            CREATE TABLE IF NOT EXISTS users (
            id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            login TEXT NOT NULL,
            passwd TEXT);
            '''
        )

        self.cursor.execute(
            '''
            INSERT INTO users (name, login, passwd)
            VALUES ("Admininstrator", "admin", "12345")
            '''
        )
        self.conn.commit()
        self.conn.close()

    def queryDB(self, sql):
        self.connDB()
        self.cursor.execute(sql)

        if sql[0:6].lower() == 'select':
            result = self.cursor.fetchall()
            self.conn.close()
            return result
        else:
            self.conn.commit()
            self.conn.close()
于 2018-12-09T18:14:38.347 回答
3

您需要SQLCipher模块来读取该数据库。默认的 SQLite3 模块不支持该功能。请参阅https://github.com/sqlitebrowser/sqlitebrowser/wiki/Encrypted-Databases

于 2018-05-17T01:25:07.810 回答