当前位置: 首页 > news >正文

【Python】sqlite加密库pysqlcipher3编译安装步骤

目录

  • 说明
  • 准备工作
    • openssl
    • 编译sqlite
    • tcl
  • setup.py修改
    • quote_argument
    • openssl路径
  • 安装
  • 加密示例代码
  • 测试
  • 附录
  • 参考

说明

pysqlcipher3是针对Python 3使用的pysqlcipher的一个分支, 尽管仍然维护对Python 2的支持。它仍然处于测试阶段, 尽管这个库包含的最新的代码量很少,并且大量借鉴了核心Python sqlite源代码,同时链接到libsqlcipher。
在执行任何操作之前,您必须传入PRAGMA key

 from pysqlcipher3 import dbapi2 as sqliteconn = sqlite.connect('test.db')c = conn.cursor()c.execute("PRAGMA key='password'")c.execute('''create table stocks (date text, trans text, symbol text, qty real, price real)''')c.execute("""insert into stocks values ('2006-01-05','BUY','RHAT',100,35.14)""")conn.commit()c.close()

可以使用hexdump -C test.db验证您的数据库文件是否被加密,机密的二进制字段是

  ab 7f 61 7a 33 9d 07 f4  08 68 c9 b0 4f e3 34 60  |..az3....h..O.4`|bb 9d 9c 3d 9e ce 69 57  b6 2f 36 c4 fd 13 bd 61  |...=..iW./6....a|77 bf e3 1d 65 b5 ea f7  d2 fc 98 31 23 66 a0 1e  |w...e......1#f..|a4 4f fa 66 49 36 84 a1  3e 0c 21 98 84 07 eb 07  |.O.fI6..>.!.....|

准备工作

openssl

安装openssl,选择对应版本即可,不要选择Light 版本
https://slproweb.com/products/Win32OpenSSL.html

环境变量增加OPENSSL_CONF
在这里插入图片描述

编译sqlite

下载 sqlcipher,编译文件
git clone https://github.com/sqlcipher/sqlcipher.git
nmake /f Makefile.msc
nmake需要在 x64 Native Tools Command Prompt for VS的终端下使用
编译会报错,只要生成sqlite3.h, sqlite3.c文件即可
想完整编译需要修改Makefile.msc再构建,https://youtu.be/SFHGeetZ0po 完整编译视频
将sqlite3.c和sqlite.h复制到根目录下的amalgamation,以及amalgamation\sqlcipher
在这里插入图片描述
在这里插入图片描述

tcl

magicsplat版本tcl地址为https://www.magicsplat.com/tcl-installer/

setup.py修改

quote_argument

对于python3.8版本

def quote_argument(arg):quote = '"' if sys.platform != 'win32' else '\\"'return quote + arg + quote

对于python3.12版本

def quote_argument(arg):quote = '"' if sys.platform == 'win32' else '\\"'return quote + arg + quote

openssl路径

修改setup.py中对应静态库位置,注意最新版libcrypto.lib的位置
在这里插入图片描述

安装

python setup.py build_amalgamation

在这里插入图片描述

python setup.py install

在这里插入图片描述

加密示例代码

借助GPT可以写一个加密sqlite的类

from pysqlcipher3 import dbapi2 as sqlite3class EncryptedDatabase:def __init__(self,db_name="standard_e.db",new_db_name="standard.db",):self.db_name = db_name  ##未加密数据库self.new_db_name = new_db_name  ##加密数据库self.password = Config.db_codeif os.path.exists(self.new_db_name):os.remove(self.new_db_name)# 原始数据库latest_tb_name = get_latest_std_table(db_name=db_name, encrypt=False)  # 替换为你的表名tb_names = ["users",latest_tb_name]# for table in tb_names:#     self.create_table(table)self.copy_data()def create_table(self, tb_name):conn = sqlite3.connect(self.new_db_name)cursor = conn.cursor()cursor.execute(f"PRAGMA key = '{self.password}'")create_table_query = f"""CREATE TABLE IF NOT EXISTS {tb_name} (id INTEGER PRIMARY KEY AUTOINCREMENT,category TEXT,name TEXT,code TEXT UNIQUE,effective_date TEXT,status TEXT,publish_date TEXT)"""cursor.execute(create_table_query)conn.commit()conn.close()def copy_data(self):conn = sqlite3.connect(self.db_name)cursor = conn.cursor()cursor.execute(f"ATTACH DATABASE '{self.new_db_name}' AS encrypted KEY '{self.password}'")cursor.execute(f"SELECT sqlcipher_export('encrypted')")cursor.execute(f"DETACH DATABASE encrypted")conn.close()

测试

Navicat无法打开加密的数据库
在这里插入图片描述

附录

编译了3个wheel文件
在这里插入图片描述

wheel下载地址

参考

https://blog.csdn.net/m0_37416991/article/details/130934309

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#/WinFrom TCP通信+ 网线插拔检测+客服端异常掉线检测
  • Linux中,MySQL的用户管理
  • 集合的面试题和五种集合的详细讲解
  • 小猪佩奇.js
  • C++图网结构算法
  • C 语言动态顺序表
  • linux系统常用命令(个人使用)
  • 深入分析 Android ContentProvider (四)
  • 《Cross-Modal Dynamic Transfer Learning for Multimodal Emotion Recognition》
  • 【Pytorch实战教程】Pytorch中.detach()的详细介绍
  • 动态多态——java
  • lua 游戏架构 之 游戏 AI (七)ai_dead
  • 爬取贴吧的标题和链接
  • 加拿大云手机:进入加拿大市场的最佳工具
  • UE5 C++在Cesium上给定一个坐标垂直地面射线正交的地形高度
  • 11111111
  • 2019.2.20 c++ 知识梳理
  • laravel with 查询列表限制条数
  • Promise面试题,控制异步流程
  • V4L2视频输入框架概述
  • Vue学习第二天
  • 测试如何在敏捷团队中工作?
  • 大型网站性能监测、分析与优化常见问题QA
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 记一次和乔布斯合作最难忘的经历
  • 普通函数和构造函数的区别
  • 数据科学 第 3 章 11 字符串处理
  • 算法---两个栈实现一个队列
  • 源码安装memcached和php memcache扩展
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​Spring Boot 分片上传文件
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • ###STL(标准模板库)
  • #AngularJS#$sce.trustAsResourceUrl
  • #define,static,const,三种常量的区别
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (04)odoo视图操作
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (差分)胡桃爱原石
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (九)c52学习之旅-定时器
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)Sublime Text3配置Lua运行环境
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (自用)交互协议设计——protobuf序列化
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 设计模式初探
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况