sqlite是一个轻量级数据库,开箱即用,不用进行繁琐的配置和安装,常用于安卓开发等场合。SQlite是用C开发的,而且是一个嵌入式数据库(即单独作为一个文件存在)。体积非常小,这也为小型应用的开发创造了便利。
但是,sqlite也有缺点,即python集成的sqlite并不支持密码加密功能,数据全部暴露在外,只要把数据库文件复制下来,sqlite就好像excel文件一样,可以在任何机器下任意被读取,这就有很大的密码泄露风险。
SQLite是完全开源的,可以免费试用。同时,SQLite官方也提供了基于开源版本SQLite进行扩展的The SQLite Encryption Extension (SEE), ZIPVFS Extension, Compressed and Encrypted ReadOnly Database (CEROD) 等高级版本。这些版本虽然也是免费的,但是都需要收费,还不便宜。
为了解决这个痛点,有一些开源版本的SQLite加密库出现了。
比较出名的有
这里以sqleet为例进行讲解。sqleet 是 SQLite3 的加密扩展。加密是透明的(即时),并基于现代加密算法,旨在实现高性能的软件和强大的侧信道抗性。 sqleet的编译很容易,因为没有外部依赖,简化了交叉编译和跨平台开发。
sqleet并没有直接提供官方的Python接口,因此想使用还需要动动脑筋。
这里的使用有两种方式,第一是调用官方的接口,即利用python调用C语言。这里涉及到一些动态链接库等C++方面的知识,我想对于大部分的Pythoner来说,可能都不容易。
另一种方式就是我们熟悉的使用方式了,即直接调用封装好的python包。
地址在:pysqleet
虽然看上去star数不是很高,但是使用Cpython封装的代码用起来也没什么问题。
对比sqlite的使用,pysqleet的使用如下所示:
import sqleet
key = b"Key"
db_name = "test.sqlite3"
# Create a new encrypted db
con = sqleet.connect(db_name, key=key)
con.execute("create table test(col char);")
con.commit()
con.close()
# Try to open db with the wrong key, this fails
try:
con = sqleet.connect(db_name, key="The wrong key")
except sqleet.AuthenticationError:
print("Failed to open database")
# Remove the encryption on the created database
con = sqleet.connect(db_name, key=key)
con.change_key(None)
con.close()
可以看到,最大的不同在于connect方法中增加了一个key参数用来对数据库进行解密。
作者在github中提供了pip方法进行安装,但是实测并不能安装成功。所以还是需要从官网下载下来之后,手动导包到自己的python虚拟环境中才能使用。
此外,这个包包装的sqleet版本是Sqleet v0.31.1,如果是别的版本的加密库,可能打不开。这点需要注意。