sqlite3加密支持

sqlite3免费版并不支持加密,不过留有接口,有不少开源的加密实现,不过有的需要使用openssl配置略显繁琐,不过使用wxsqlite比较方便。

wxSqlite3

wxSqlite3是wxWidgets的扩展组件,对sqlite3的C API进行了封装,并且实现了加解密功能。
目前支持两种算法,AES128算法(默认)和AES256算法
wxSqlite在secure/src/sqlite3secure.c中引入了其他源文件,这样你只用编译sqlite3secure.c就可以了,但是这样有时会比较麻烦。

sqlite3-secure

项目地址
我这里说的sqlite3-secure就是从wxSqlite3中提取的,只不过做了些修改,更加方便使用,直接添加到工程中就可以了。
而且使用起来仍然使用sqlite3的C API,没有什么C++的封装。

经过测试的系统:Mac OS X, iOS, Android

修改了什么?

  • 将不用添加到工程的C源文件后缀名改为ccode(要不然得屏蔽编译这些文件,否则会出现符号重复的错误)
  • 默认启用加密支持(添加启用加密的宏)
  • 删除了wxsqlite的C++封装,只提供原生sqlite3-api
  • 删除了shell.c(编译shell命令工具sqlite的代码)
  • 整理了目录结构

加密解密API

// 解密或用于第一次加密
int sqlite3_key(sqlite3 *db, const void *zKey, int nKey);
// 重设密码
int sqlite3_rekey(sqlite3 *db, const void *zKey, int nKey);

注意:

  • 第一次创建数据库,使用sqlite3_key或者sqlite3_rekey都可以设置密码
  • 必须在sqlite3_open成功之后,使用sqlite3_key进行解密
  • 要重新设置密码(sqlite3_rekey),必须解密成功后才可以进行
  • 一般不重设密码的话,只使用sqlite3_key就够了

DEMO

//
// main.cpp
// sqlite3
//
// Created by Luwei on 15/1/9.
// Copyright (c) 2015年 Luwei. All rights reserved.
// #include <iostream> #include "sqlite3-secure/sqlite3.h" void db_open(sqlite3 **ppDb, const std::string &path);
void db_close(sqlite3 *pDb);
void db_encrypt(sqlite3 *pDb, const std::string &password); // DEMO
void db_createtable(sqlite3 *pDb);
void db_insert(sqlite3 *pDb);
void db_delete(sqlite3 *pDb);
void db_update(sqlite3 *pDb);
void db_select(sqlite3 *pDb); int main()
{
std::string path = "/Users/etime/Documents/db";
std::string password = "hello,world";
sqlite3 *pDb = nullptr; try { db_open(&pDb, path);
db_encrypt(pDb, password); db_createtable(pDb);
db_insert(pDb);
db_delete(pDb);
db_update(pDb);
db_select(pDb); db_close(pDb);
}
catch (const char *what) {
printf("[DB Error]: %s\n", what);
sqlite3_close(pDb);
return -;
}
return ;
} void db_open(sqlite3 **ppDb, const std::string &path) {
int c = SQLITE_OK;
if (path.empty())
c = sqlite3_open(":memory", ppDb);
else
c = sqlite3_open(path.c_str(), ppDb); if (c != SQLITE_OK)
throw sqlite3_errmsg(*ppDb);
} void db_close(sqlite3 *pDb) {
int c = sqlite3_close(pDb); if (c != SQLITE_OK)
throw sqlite3_errmsg(pDb);
} void db_encrypt(sqlite3 *pDb, const std::string &password) {
int c = SQLITE_OK;
if (password.empty())
return;
else
c = sqlite3_key(pDb, password.c_str(), (int)password.length()); if (c != SQLITE_OK)
throw sqlite3_errmsg(pDb); // sqlite3_rekey()
} void db_createtable(sqlite3 *pDb) {
const char *sql = "CREATE TABLE IF NOT EXISTS user"
"([id] INTEGER PRIMARY KEY, name TEXT)"; int c = sqlite3_exec(pDb, sql, nullptr, nullptr, nullptr); if (c != SQLITE_OK)
throw sqlite3_errmsg(pDb);
} void db_insert(sqlite3 *pDb) {
const char *sql = "INSERT INTO user values(NULL, 'luweimy')"; int c = sqlite3_exec(pDb, sql, nullptr, nullptr, nullptr); if (c != SQLITE_OK)
throw sqlite3_errmsg(pDb); int count = sqlite3_changes(pDb);
printf("[DB Log]: <INSERT> %d item changes\n", count);
} void db_delete(sqlite3 *pDb) {
const char *sql = "DELETE FROM user WHERE id=2"; int c = sqlite3_exec(pDb, sql, nullptr, nullptr, nullptr); if (c != SQLITE_OK)
throw sqlite3_errmsg(pDb); int count = sqlite3_changes(pDb);
printf("[DB Log]: <DELETE> %d item changes\n", count);
} void db_update(sqlite3 *pDb) {
const char *sql = "UPDATE user SET name=\"**luweimy**\" WHERE id=1"; int c = sqlite3_exec(pDb, sql, nullptr, nullptr, nullptr); if (c != SQLITE_OK)
throw sqlite3_errmsg(pDb); int count = sqlite3_changes(pDb);
printf("[DB Log]: <UPADTE> %d item changes\n", count);
} void db_select(sqlite3 *pDb) {
const char *sql = "SELECT * FROM user"; sqlite3_stmt *pStmt = nullptr;
int c = sqlite3_prepare_v2(pDb, sql, (int)strlen(sql), &pStmt, nullptr);
if (c != SQLITE_OK)
throw sqlite3_errmsg(pDb); c = sqlite3_step(pStmt);
if (c != SQLITE_ROW && c != SQLITE_DONE)
throw sqlite3_errmsg(pDb); int colnum = sqlite3_column_count(pStmt); while (c == SQLITE_ROW) {
for (int i = ; i < colnum; i++) {
printf("%s \t \t", sqlite3_column_text(pStmt, i));
}
printf("\n");
c = sqlite3_step(pStmt);
} if (c != SQLITE_DONE)
throw sqlite3_errmsg(pDb); c = sqlite3_finalize(pStmt);
if (c != SQLITE_OK)
throw sqlite3_errmsg(pDb);
}

sqlite3加密支持的更多相关文章

  1. net-snmp源码VS2013编译添加加密支持(OpenSSL)

    net-snmp源码VS2013编译添加加密支持(OpenSSL) snmp v3 协议使用了基于用户的安全模型,具有认证和加密两个模块. 认证使用的算法是一般的消息摘要算法,例如MD5/SHA等.这 ...

  2. net-snmp源码VS2013编译添加加密支持(OpenSSL)(在VS里配置编译OpenSSL)

    net-snmp源码VS2013编译添加加密支持(OpenSSL) snmp v3 协议使用了基于用户的安全模型,具有认证和加密两个模块. 认证使用的算法是一般的消息摘要算法,例如MD5/SHA等.这 ...

  3. sqlite3加密

    最近因为工作原因,需要使用sqlite数据库.sqlite数据库小并且使用方便,感觉挺不错的.但有一个不足就是没有对数据库进行加密,不过好的是sqlite预留有加密的接口,我们可以直接调用即可.我也是 ...

  4. 在Winform开发框架中实现对数据库的加密支持

    在很多情况下,我们需要对数据库进行加密,特别是Access数据库.Sqlite数据库,这些直接部署在客户端的数据,因为数据也是客户的资产,数据库总是存在很多相关的秘密或者重要的业务数据,所以一般来说, ...

  5. 在Winform开发框架中实现对数据库的加密支持(转)

    在很多情况下,我们需要对数据库进行加密,特别是Access数据库.Sqlite数据库,这些直接部署在客户端的数据,因为数据也是客户的资产,数据库总是存在很多相关的秘密或者重要的业务数据,所以一般来说, ...

  6. MD5Encoder加密支持utf-8

    import java.security.MessageDigest; public class MD5Encoder { public static String encode(String str ...

  7. delphi Sqlite

    Delphi中SQLite如何读写二进制字段(Blob类型) 在Delphi中,有大量的组件可以操作SQLite数据库,如UniDAC就是其中一个比较优秀的,当然还有ASQLite3Component ...

  8. Cocos2dx使用wxsqlite开源加密SQLite3数据库

    最近使用wxsqlite加密sqlite3数据库,刚开始折腾好几天,在xcode上一直编译不通过,后来在sqlite3.c找到配置,编译顺利通过,太激动了,哈哈,废话少说!总结一下android和io ...

  9. 交叉编译Python-2.7.13到ARM(aarch32)—— 支持sqlite3

    作者:彭东林 邮箱:pengdonglin137@163.com QQ: 405728433 环境 主机: ubuntu14.04 64bit 开发板: qemu + vexpress-a9 (参考: ...

随机推荐

  1. chart.js图表库案例赏析,饼图添加文字

    chart.js图表库案例赏析,饼图添加文字 Chart.js 是一个令人印象深刻的 JavaScript 图表库,建立在 HTML5 Canvas 基础上.目前,它支持6种图表类型(折线图,条形图, ...

  2. asp.net webservice 返回json数据乱码解决方法

    [WebMethod] public void QueryRiskNotice(string phone) { try { var data = _riskNoticeDal.QueryRiskNot ...

  3. android 自定义折线图

    看图: 比较简陋,主要是通过canvas画上去的: package com.example.democurvegraph.view; import java.util.ArrayList; impor ...

  4. [原创] zabbix学习之旅二:yum安装

    对于允许连接公网的环境下,显然通过yum安装是最为简单方便的,也是官网推荐的安装方式.通过这种方式安装,会将php.apache.zabbix本身都一并安装,解决了烦人的依赖包问题.   本文将介绍如 ...

  5. bzoj 1270 DP

    w[i,j]代表高度j,第i颗树的时候的最大值 那么w[i,j]:=max(w[i,j+1],w[k,j+heigh])+sum[i,j]: 但是这样枚举是n^3的,我们发现转移的第二个选择w[k,j ...

  6. 【BZOJ】【1046】【HAOI2007】上升序列

    DP+贪心 啊……其实是个水题,想的复杂了 令f[i]表示以 i 为起始位置的最长上升子序列的长度,那么对于一个询问x,我们可以贪心地从前往后扫,如果f[i]>=x && a[i ...

  7. Matlab梯度下降解决评分矩阵分解

    for iter = 1:num_iters %梯度下降 用户向量 for i = 1:m %返回有0有1 是逻辑值 ratedIndex1 = R_training(i,:)~=0 ; %U(i,: ...

  8. Phyre LCUE with YEBIS cause issues about GS

    when LCUE enabled in phyreEngine when Yebis integrated and render there are two mainloopdraws in one ...

  9. POJ 3185

    The Water Bowls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4088   Accepted: 1609 D ...

  10. 真机模拟器.a文件编译报错