我正在尝试将一些代码从 C# 迁移到 Python(在 Windows 上),它读取使用 SQLCipher 加密的 SQLite 数据库,并且在 Python 中打开数据库时遇到了麻烦。这让我想知道它是否与我的 PRAGMA KEY 指令的格式有关(因为没有 PRAGMA KEY 的相同代码可以打开未加密的数据库),在执行和尝试查询数据库时我得到一个异常,指出“文件不是一个数据库”,我在 C# 下看到很多错误的键(尽管 SQLite 浏览器中的相同键确实按预期工作)。
从https://github.com/rigglemania/pysqlcipher3/借用我的 Python 包装器并使用来自https://sqlitebrowser.org的二进制文件(以及使用该工具来验证原始密钥是否正确),我知道我需要使用 PRAGMA key 命令来指定密钥,经过一些阅读和一些随机尝试后,尝试了一些(完整的 64 字符密钥,显示基本格式):
c.execute("PRAGMA key=\"x'aa..ff'\"")
c.execute("PRAGMA key='raw:aa..ff'")
c.execute("PRAGMA key='x:aa..ff'")
c.execute("PRAGMA key='aa..ff'")
c.execute("PRAGMA key= 'AA..FF'")
c.execute("PRAGMA key = \"x\'aa..ff\'\";")
c.execute("PRAGMA key= xaa..ff")
所有的结果都是一样的,同样的“文件不是数据库”异常,或者偶尔会出现键的语法错误。
归结起来,代码或多或少是这样的:
from pysqlcipher3 import dbapi2 as sqlite
conn = sqlite.connect("path_to_sqlite_db")
c = conn.cursor()
c.execute("PRAGMA key='x:__the_hex_key__'") #or one of the multiple attempts above
rows = c.execute("SELECT * FROM sqlite_master;")
for row in rows.fetchall():
print(row)
c.close()
我有什么明显的遗漏吗?