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. TWaver初学实战——基于HTML5的交互式地铁图

    每天坐地铁,经常看地铁图,有一天突然想到,地铁图不也是一种拓扑结果吗?TWaver到底能与地铁图擦出怎样的火花呢?   想到就干,先到网上找幅参考图.各种风格的地铁图还挺多,甚至有大学生自主设计制作, ...

  2. Careercup - Google面试题 - 5162732873580544

    2014-05-08 08:26 题目链接 原题: Given a preorder traversal, create a binary search tree in optimized time ...

  3. CentOS6.5 安装JDK1.7详细步骤参考

    一般情况下,我们都要将linux自带的OPENJDK卸载掉,然后安装SUN的JDK. 首先查看Linux自带的JDK是否已安装. 输入如下命令,查看已经安装的JAVA版本信息. 输入如下命令,查看JD ...

  4. 显示器VGA视频数据线的问题

    一朋友原来有一套PC电脑,后来买了一台新的显示器,新的显示器分辨率为1920X1080,主机接到新的显示器上,分辨率始终无法上到1920X1080,原主机的显示卡驱动已经是最新,还是不行,又重新安装操 ...

  5. iOS网络传输Delegate不被触发的本质原因

    NSURLSession一共有四种Delegate (文后附表有Session和SessionTask分类表格) NSURLSessionDelegate, NSURLSessionDownloadD ...

  6. HDU 5446 Unknown Treasure Lucas+中国剩余定理

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 Unknown Treasure 问题描述 On the way to the next se ...

  7. HDU 5294 Tricks Device 最短路+最大流

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5294 题意: 给你个无向图: 1.求最少删除几条边就能破坏节点1到节点n的最短路径, 2.最多能删除 ...

  8. hdu 3487 Play with Chain

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3487 YaoYao is fond of playing his chains. He has a c ...

  9. java 验证身份证号

  10. Nginx使用webbench进行压力测试(转载)

    在运维工作中,压力测试是一项非常重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验. 但是,在压力测试中存在一个共性,那就是压力测试的 ...