sqlcipher github下载地址:
https://github.com/sqlcipher/sqlcipher
测试demon 代码:
https://gitee.com/kamenqing/sqlite-demon
编译其实就3步:
前提条件:已经安装了openssl
1> 运行 ./configure 配置文件,命令如下
./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2" LDFLAGS="/usr/local/opt/openssl@1.1/lib/libcrypto.a" --prefix="/Users/yangsen/Desktop/sqlcipher/builddir
1>: 编译静态库的时候要是用加密的功能就必须配置这三个选项:
--enable-tempstore=yes
-DSQLITE_HAS_CODEC
-DSQLITE_TEMP_STORE=2
2>: openssl 加密库(根据自己的路径加载) 可用which libcrypto.a 命令查找
LDFLAGS="/usr/local/opt/openssl@1.1/lib/libcrypto.a
3>: 编译生成目录,( bin, include, lib)
--prefix="/Users/yangsen/Desktop/sqlcipher/builddir
2>make(前提是没有报错)
报错:
/bin/sh: 1: tclsh: not found 要下载tcl
下载地址:http://www.tcl.tk/software/tcltk/download.html
3>make install (结果如下)
Qt 加载使用 sqlcipher
工程文件 需加载对应的库 和 include
最重要的一点到了:
加载sqlite3.h 文件的時候, 一定要加上这个宏
具体原因:不加的话 调用 sqlite3_key 会报错
#include <QCoreApplication>
#include"sqlcipher/sqlite3.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ERROR(X)
static int callback(void *NotUsed, int argc, char **argv, char **col_name)
{
int i;
for(i=0; i<argc; i++)
{
printf("打印结果;\n");
printf("%s\n", argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
sqlite3 *db;
const char *file= "test.db";
const char *key = "123456";//key为使用sqlcipher设置的密码
if (sqlite3_open(file, &db) == SQLITE_OK)
{
int rc;
if(db == NULL)
{
ERROR(("sqlite3_open reported OK, but db is null, retrying open %s\n", sqlite3_errmsg(db)))
}
//验证密码是否正确
if(sqlite3_key(db, key, strlen(key)) != SQLITE_OK)
{
ERROR(("error setting key %s\n", sqlite3_errmsg(db)))
exit(-1);
}
//SQLlite 操作代码...
char* sql1 = "create table if not exists test(int id,varchar name);";
char* sql2 = "insert into test values(1,'hello');";
char* sql3 = "select * from test;";
char* err_msg = NULL;
rc = sqlite3_exec(db, sql1, callback, 0, &err_msg);
if( rc!=SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
err_msg = NULL;
}
rc = sqlite3_exec(db, sql2, callback, 0, &err_msg);
if( rc!=SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
err_msg = NULL;
}
rc = sqlite3_exec(db, sql3, callback, 0, &err_msg);
if( rc!=SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
err_msg = NULL;
}
sqlite3_close(db);
}
return a.exec();
}
运行结果如下: