android native C++编程实现数据库加密sqlcipher
sqlcipher是sqlite的加版本,分为免费版和收费版。
这里研究的是开源的免费版
https://github.com/sqlcipher/sqlcipher
Android码源默认提供了sqlite的native,jni和java版本,但没有提供sqlcipher,开发用到需要自己添加。
sqlcipher需要配置openssl,写一个android.bp
android_sqlite_cflags = ["-DHAVE_USLEEP=1","-DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576","-DSQLITE_THREADSAFE=1","-DNDEBUG=1","-DSQLITE_ENABLE_MEMORY_MANAGEMENT=1","-DSQLITE_TEMP_STORE=3","-DSQLITE_ENABLE_FTS3_BACKWARDS","-DSQLITE_ENABLE_LOAD_EXTENSION","-DSQLITE_ENABLE_MEMORY_MANAGEMENT","-DSQLITE_ENABLE_COLUMN_METADATA","-DSQLITE_ENABLE_FTS4","-DSQLITE_ENABLE_UNLOCK_NOTIFY","-DSQLITE_ENABLE_RTREE","-DSQLITE_SOUNDEX","-DSQLITE_ENABLE_STAT3","-DSQLITE_ENABLE_FTS4_UNICODE61","-DSQLITE_THREADSAFE","-Wno-unused-parameter","-Wno-pointer-arith","-Wno-unused-variable"
]sqlcipher_cflags = ["-DSQLITE_HAS_CODEC","-DHAVE_FDATASYNC=0","-Dfdatasync=fsync",
]sqlcipher_files = ["src/sqlite3.c"]//APP_STL := c++_shared
//APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
//APP_PLATFORM := android-26// ANDROIDMK TRANSLATION ERROR: unsupported assignment to LOCAL_EXPORT_C_INCLUDES
// LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include///LOCAL_SRC_FILES := $(LOCAL_PATH)/lib/arm64-v8a/libcrypto.so
// ANDROIDMK TRANSLATION ERROR: unsupported include
// include $(PREBUILT_SHARED_LIBRARY)
cc_prebuilt_library_shared {name: "libcrypto2",target: {android_arm: {srcs: ["lib/armeabi-v7a/libcrypto.so"],},android_arm64: {srcs: ["lib/arm64-v8a/libcrypto.so"],},},strip: {none:true,},//shared_libs: ["libx", "libxx", "libxxx", "libxxxx"],check_elf_files: false,compile_multilib: "both"//32位和64位都预编译
}cc_library_shared {name: "sqlite3_ext2",host_ldlibs: ["-llog"],srcs: sqlcipher_files,local_include_dirs: ["src","include",],cflags: android_sqlite_cflags + sqlcipher_cflags,//LOCAL_STATIC_LIBRARIES := static-libcryptoshared_libs: ["libcrypto2", "liblog",],}
详细使用看:
GitHub - blogercn/android_sqlciphe: android natvity C/C++使用的加密数据库sqlciphe
可以用于ndk,可以复制到android源码供C++层开发使用
sqlite数据库修改数据需要提交事务,否则显示成功,但并没有入库。
sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, NULL);
if (rc != SQLITE_OK)
{
std::cout << "EventLogServer SQL错误: " << errMsg << std::endl;
sqlite3_free(errMsg);
rc = sqlite3_exec(db, "ROLLBACK;", nullptr, nullptr, nullptr);
}
else
{
rc = sqlite3_exec(db, "COMMIT;", NULL, NULL, NULL);
}
如下:
int IEventLogServer::insertLog(slog& log)
{
sqlite3* db;
int rc = sqlite3_open(LOG_DATABASE, &db);
if (rc != SQLITE_OK)
{
std::cout << "EventLogServer 无法打开数据库: " << sqlite3_errmsg(db) << std::endl;
sqlite3_close(db);
return rc;
}
rc = sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, NULL); // 开始事务
if (rc != SQLITE_OK) {
std::cout << "Failed to begin transaction: " << sqlite3_errmsg(db) << std::endl;
sqlite3_close(db);
return rc;
}
char* errMsg = nullptr;
std::string sql = "INSERT INTO " + std::string(LOG_TABLE) +" (Severity, EventID, BaseEventCount, TimeStamp, Source) VALUES (" +
std::to_string(log.Severity) + ", " + std::to_string(log.EventID) + ", " +
std::to_string(log.BaseEventCount) + ", " + std::to_string(log.TimeStamp) +", '" + log.Source + "');";
rc = sqlite3_exec(db, sql.c_str(), nullptr, nullptr, &errMsg);
if (rc != SQLITE_OK)
{
std::cout << "EventLogServer SQL错误: " << errMsg << std::endl;
sqlite3_free(errMsg);
rc = sqlite3_exec(db, "ROLLBACK;", nullptr, nullptr, nullptr);
}
else
{
rc = sqlite3_exec(db, "COMMIT;", NULL, NULL, NULL);
}
sqlite3_close(db);
return rc;
}
相关文章:
android native C++编程实现数据库加密sqlcipher
sqlcipher是sqlite的加版本,分为免费版和收费版。 这里研究的是开源的免费版 https://github.com/sqlcipher/sqlcipher Android码源默认提供了sqlite的native,jni和java版本,但没有提供sqlcipher,开发用到需要自己添加。 sqlc…...

第五节 C++ 循环结构(算法)
文章目录 前言介绍1. for 语句1.1 语法结构1.2 语法流程的执行过程1.2.1 案例 1:循环的正序输入和倒序输入1.2.2 案例2 : 求1~n的平方数1.2.3 案例 3: 求输入a和b,求a~b区间数. 1.3 for 循环案例练习1.3.1 求最大值与最小值1.3.2 计算奇数和和偶数和1.3.3 计算平均气温与最高气…...
接口与抽象类的区别
a、抽象类不能被实例化只能被继承;b、包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;c、抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;d、一个子类继承一个抽象类,则子类…...

短视频账号矩阵系统源码saas===独立部署
前言: 短视频账号矩阵是指在不同的短视频平台上,一个个人或企业所拥有的账号数量和分布情况。由于不同的短视频平台受众人群和内容类型等因素不同,因此拥有更多账号可以在更广泛的受众中传播内容,提高曝光度和流量。短视频账号矩阵…...

香港专用服务器拥有良好的国际网络连接
香港服务器在多个领域有着广泛的应用。无论是电子商务、金融交易、游戏娱乐还是社交媒体等,香港服务器都能够提供高效稳定的服务。对于跨境电商来说,搭建香港服务器可以更好地满足亚洲用户的购物需求;对于金融机构来说,香港服务器…...

IP/SIP网络有源吸顶喇叭 20W扬声器 可供POE供电
IP/SIP网络有源吸顶喇叭 20W扬声器 可供POE供电 深圳锐科达SV-7043VP 20W网络有源吸顶喇叭。该设备配备了10/100M以太网接口,内置了高品质扬声器,通过内置的功放和喇叭输出,可提供高达20W的音效功率。SV-7043VP作为SIP系统的播放终端&#…...
基于Keil a51汇编 —— 程序模板文件以及规则
程序模板文件 下面的代码模板包含有关如何编写自己的程序集模块的指南和提示。此模板文件模板。A51 在文件夹 \C51\ASM 中提供。 $NOMOD51 ; 禁用预定义的 8051 寄存器 #include <reg52.h> // 包含头文件; ;根据需要更改小写名称。 ;该汇编模板让你…...
案例研究 | 玉湖冷链基于JumpServer实现管理安全一体化
玉湖冷链(中国)有限公司(以下简称为玉湖冷链)是玉湖集团旗下的冷链食品供应链企业。依托自有的国际高标数智化冷链园区产业集群,玉湖冷链提供一站式国内外代采、仓干配物流解决方案、全链路创新金融支持、高品质生活办…...

JavaEE初阶学习:HTTP协议和Tomcat
1. HTTP协议 HTTP协议是一个非常广泛的应用层协议~~ 应用层协议 —> TCP IP 协议栈 应用层 —> 关注数据怎么使用~ 传输层 —> 关注的是整个传输的起点和终点 网络层 —> 地址管理 路由选择 数据链路层 —> 相邻节点之间的数据转发 物理层 —> 基础设置,硬…...

ASEMI整流桥GBU810参数,GBU810封装
编辑-Z GBU810参数描述: 型号:GBU810 最大直流反向电压VR:1000V 最大工作峰值反向电压VRWM:700V 最大平均正向电流IF:8A 非重复正向浪涌电流IFSM:200A 操作和储存温度范围TJ ,TSTG:-55 t…...

docker应用记录总结
一、前言 docker这类部署工具,久而久之不使用非常容易忘记,甚至连操作命令都容易忘记。网上也有比较全的docker使用教程。这里做一个记录总结,纯属是温故知新。 二、docker部署应用 1、docker印象 docker首先让我想到的是是虚拟化技术&…...

Jenkins 添加节点Node报错JNI error has occurred UnsupportedClassVersionError
节点日志 报错信息如下 Error: A JNI error has occurred, please check your installation and try again Exception in thread “main” java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher has been compiled by a more recent version of the Java Runtime…...

swift ui 布局 ——Stack(HStack、VStack、ZStack)
一、HStack 水平布局 将其子视图排列在水平线上 import Foundation import SwiftUI struct MyView: View {var body: some View {HStack{Text("text")Image("yuyin").resizable().frame(width: 102,height: 80)}} } 默认子视图是水平中心对齐的,可添加al…...

淘宝天猫商品评论数据接口,淘宝天猫商品评论API接口,淘宝API
淘宝商品评论数据接口可以通过淘宝开放平台API获取。 通过构建合理的请求URL,可以向淘宝服务器发起HTTP请求,获取商品评论数据。接口返回的数据一般为JSON格式,包含了商品的各种评价信息。获取到商品评论数据后,可以对其进行处理…...

C# Onnx GFPGAN GPEN-BFR 人像修复
效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;namespace 图像修复 {public partial class Form1 : For…...

ubuntu安装依赖包时显示需要先安装其所需要的各种安装包)apt-get源有问题
最近在崭新的ubuntu上安装g以及一些其他的依赖与工具时遇到以下报错情况: 依赖环环相扣,手动无法解决。 总结: 出现需要很多依赖项的情况是因为软件源中没有可用的依赖项或者依赖项版本不正确。 其实在Ubuntu系统中,使用sudo…...

C/C++之自定义类型(结构体,位段,联合体,枚举)详解
个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 个人主页:点我进入主页 …...

HBase 表如何按照某表字段排序后顺序存储的方法?
首先需要明白HBase表的排序规则: (1)rowkey排序(字典排序)——升序 (2)Column排序(字典排序)——升序 (3)时间戳排序——降序 rowkey 字典序排序…...

webrtc用clang编译支持h264,支持msvc调用库
webrtc遇到困扰: 如果msvc编译,ffmpeg编译失败,需要替换ffmpeg库。如果用clang编译,vs或qt调用dll又存在崩溃。 经过反复尝试找到解决方法: 一、编译 1、编译参数 //我得环境配置 set DEPOT_TOOLS_UPDATE0 set DEP…...
迁移学习是什么?
迁移学习(Transfer Learning)是一种机器学习方法,它的主要思想是将已经在一个任务上学到的知识迁移到另一个相关或不相关的任务上,以提高目标任务的性能。迁移学习的核心概念是,模型可以通过先前学到的知识来更好地解决…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...