Python3 使用 sqlcipher 来增强本地数据的安全性

news/发布时间2024/5/14 23:11:29

使用 sqlcipher 来增强本地数据的安全性

本文是基于 系列文章 PyQt5+SQLAlchemy做登录注册页 的补充,并不单独放在系列文中,主要讲的是,使用 sqlcipher 来保存本地密码,这比直接使用 SQLite 更安全

关于 sqlcipher,官方介绍原文如下:

SQLCipher is a standalone fork of the SQLite database library that adds 256 bit AES encryption of database files and other security features like:

  • on-the-fly encryption
  • tamper detection
  • memory sanitization
  • strong key derivation

安装环境

  • windows 10 x64
  • Python 3.8.10 64bit

第1步 安装sqlcipher

安装 sqlcipher,安装比较繁琐,你也可以使用我这里提供的文件,但是最好自己编译,安装编译依照这篇回答,点击前往

步骤描述如下:

  1. 安装 ActiveTcl 8.6,需要用到其中的 tclsh.exe
    安装后,需要添加到系统环境变量:path=C:\ActiveTcl\bin
    image

  2. 安装Microsoft Visual Studio 2017 只安装 C++ 桌面开发
    image

  3. 安装 Win64 OpenSSL v1.1.1w 除了安装路径,其他都选项不做修改
    安装后需要添加系统环境变量:
    x64 添加OPENSSL_CONF=C:\Program Files\OpenSSL-Win64\bin\openssl.cfg
    x32 添加OPENSSL_CONF=C:\Program Files(x86)\OpenSSL-Win32\bin\openssl.cfg
    image

  4. 对安装的OpenSSL 做一些修改,下面操作全在文件夹 D:\Program Files\OpenSSL-Win64\lib中执行
    复制 libcrypto.deflibcrypto.lib 为副本,并修改副本名称为libeay32.deflibeay32.lib
    复制 libssl.deflibssl.lib 为副本,并修改副本名称为ssleay32.defssleay32.lib
    image

  5. 复制文件夹 D:\Program Files\OpenSSL-Win64\include\opensslD:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include,前一个路径是 OpenSSL 安装路径,后一个路径是Visual Studio 2017安装路径

  6. 下载 sqlcipher,可直接克隆,或者下载压缩包

  7. 修改 sqlcipher 的编译文件 Makefile.msc,修改内容如下

    第1句,修改下面这句:

    TCC = $(TCC) -DSQLITE_TEMP_STORE=1
    

    修改为下面,其中的路径为 OpenSSL 安装路径:

    TCC = $(TCC) -DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC -I"D:\Program Files\OpenSSL-Win64\include"
    

    第2句,修改下面这里:

    # If ICU support is enabled, add the linker options for it.
    #
    !IF $(USE_ICU)!=0
    LTLIBPATHS = $(LTLIBPATHS) /LIBPATH:$(ICULIBDIR)
    LTLIBS = $(LTLIBS) $(LIBICU)
    !ENDIF
    # <</mark>>
    # You should not have to change anything below this line
    

    修改为下面,其中的路径为 OpenSSL 安装路径:

    # If ICU support is enabled, add the linker options for it.
    #
    !IF $(USE_ICU)!=0
    LTLIBPATHS = $(LTLIBPATHS) /LIBPATH:$(ICULIBDIR)
    LTLIBS = $(LTLIBS) $(LIBICU)
    !ENDIF
    # <</mark>>LTLIBPATHS = $(LTLIBPATHS) /LIBPATH:"D:\Program Files\OpenSSL-Win64\lib\VC\static"
    LTLIBS = $(LTLIBS) libcrypto64MT.lib libssl64MT.lib ws2_32.lib shell32.lib advapi32.lib gdi32.lib user32.lib crypt32.lib# You should not have to change anything below this line
    
  8. 打开 Visual Studio 的 x64工具,执行下的操作: image,此步执行过程可能会报错,但是只要在 sqlcipher文件夹中生成sqlite3.csqlite3.h就行

    # 切换到sqlcipher
    cd /d F:\Projects\sqlcipher# 编译
    nmake /f Makefile.msc clean
    nmake /f Makefile.msc
    

    image

  9. 下载pysqlcipher3,可直接克隆,或者下载压缩包
    /pysqlcipher3 中创建文件夹 amalgamation,然后将第8步中生成的sqlite3.csqlite3.h复制到 amalgamation中。
    然后在/pysqlcipher3/src/python3中,创建一个文件夹sqlcipher

  10. 下载sqlite-amalgamation,我这里使用的是这个sqlite-amalgamation-3340100,下载解压后,复制其中的4个文件shell.c sqlite3.c sqlite.h sqliteext.h,复制到/pysqlcipher3/src/python3/sqlcipher

  11. 继续在 Visual Studio 的 x64工具,执行下的操作: image,我这里使用的是 Python3.8.10 64bit

    # 切换到 pysqlcipher3
    cd F:\Projects\pysqlcipher3python setup.py clean
    python setup.py build_amalgamationpython setup.py install
    

    python setup.py build_amalgamation执行后截图
    image

    python setup.py install执行后截图
    image

第2步,测试安装

使用下列代码测试

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test.py
@ Version     : V1.0.0
@ Description :
"""
from pysqlcipher3 import dbapi2 as sqliteconn1 = sqlite.connect("test.db")
c1 = conn1.cursor()
c1.execute("PRAGMA key='123456'")
c1.execute("""create table stocks (date text, trans text, symbol text, qty real, price real)""")
c1.execute("""insert into stocks values ('2006-01-05','BUY','RHAT',100,35.14)""")
conn1.commit()
c1.close()conn2 = sqlite.connect("test.db")
c2 = conn2.cursor()
c2.execute("PRAGMA key='123456'")
print(c2.execute("""select * from stocks""").fetchall())
c2.close()

使用最新版本的DB.Browser.for.SQLite 3.12.2查看
image

参考文章

Install pysqlcipher3 windows
编译Windows 64bit平台pysqlcipher3 for Python3.7

本文章的原文地址
GitHub主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/56237452.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

Docker 最常用的镜像命令和容器命令

目录一、帮助命令二、运行第一个容器:hello-world2.1 运行命令2.2 命令执行流程图三、镜像相关命令及其基本操作3.1 登录私有镜像仓库3.2 拉取镜像3.3 查看镜像基本信息3.3.1 docker images 命令查看镜像基本信息(一)、docker images命令常用选项 -a : 显示所有的镜像(包括…

又发现一款免费好用的 AI 写代码神器,好用到爆,GitHub Copilot 可以扔了。。

大家好 ,我是R哥。 近两年 AI 太火了,风靡全球,AI 编程工具也没有落下,比如微软的 GitHub Copilot,还有阿里的通义灵码,连 JetBrains 系列工具都逼出了自家的 AI 功能。 大家知道我是效率狂人,同样也是工具狂人,之前给大家分享了不少开发神器,其中也不乏国内的优秀选手…

轻松创建基于 GPT-4 的 AI 原生应用 - Dify

Dify 是一个易用的 LLMOps 平台,旨在让更多人可以创建可持续运营的原生 AI 应用。Dify 提供多种类型应用的可视化编排,应用可开箱即用,也能以后端即服务的 API 提供服务。LLMOps(Large Language Model Operations)是一个涵盖了大型语言模型(如 GPT 系列)开发、部署、维护…

汽车制造业供应商管理会面临哪些问题?要如何解决?

汽车行业的供应链是及其复杂的,并且呈全球化分布,企业在知识产权方面的优势很可能是阶段性的。企业需要持续保持领先,将面临巨大的挑战,尽快地将产品推向市场是保持领先的唯一途径。然而,如果没有正确的方式去实现安全性、流程化和标准化,企业的优势则有可能不复存在,比…

递归组件实现子向父传值

业务逻辑:通过自己调用自己的方式生成树,再点击子菜单时,需要将点击子菜单的菜单名传值给父组件(使用总线 bus) 新建bus.js文件import { ref } from vueclass Bus {constructor() {// 收集订阅信息,调度中心this.eventList = {}, // 事件列表,这项是必须的// 下面的都是自…

[转帖]JUC内置线程池

https://cloud.tencent.com/developer/article/2235750 ThreadPoolExecutor ThreadPoolExecutor是最基础的线程池类:12345678public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueu…