【发布时间】:2020-08-30 11:32:21
【问题描述】:
我正在研究嵌入式系统,该设备具有带有 sqlite 数据库的 linux 内核。想知道sqlite数据库是否可以用安全分区和普通分区进行分区。
如何在linux下对sqlite数据库文件进行加密。
【问题讨论】:
标签: sqlite
我正在研究嵌入式系统,该设备具有带有 sqlite 数据库的 linux 内核。想知道sqlite数据库是否可以用安全分区和普通分区进行分区。
如何在linux下对sqlite数据库文件进行加密。
【问题讨论】:
标签: sqlite
也许我回答这个问题为时已晚,但我从几天开始就面临这个问题并且无法在网上找到任何可靠的解决方案。我找到了解决方案,因此我分享它。
//sqlite数据库认证步骤
下载 sqlite3 合并 zip 文件
解压缩文件。该文件应包含 shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h
3a。打开 userauth.c 并复制整个代码并将其粘贴到 sqlite3.c 文件的末尾。
3b。打开 sqlite3userauth.h 并复制整个代码并将其粘贴到 sqlite3.h 文件的末尾。
gcc -o sqlite3Exe shell.c sqlite3.c -DSQLITE_USER_AUTHENTICATION -ldl -lpthread
4a。你会在你的 shell.c 文件中得到错误没有这样的文件“sqlite3userauth.h”: 解决方案:转到该文件并注释第 行。(这是因为您在将 sqlite3auth.h 复制到 sqlite3.h 时已经包含了必要的代码)
4b。通过运行./sqlite3Exe 测试您的输出文件(这是您在上一步中生成的输出文件的名称)。你会得到 sqlite 控制台。
4c。创建数据库并在身份验证标志上:
command1:.open dbname.db
command2:.auth on
command3: .exit//command 3 是可选的
命令:gcc -o sqlite3.o -c sqlite3.c -DSQLITE_USER_AUTHENTICATION
使用这个命令,我们生成目标文件,我们可以用它来编译我们的 c 文件。
创建 c 文件以验证您的数据库:
//authUser.c
#include "stdio.h"
#include "stdlib.h"
#include "sqlite3.h"
int main(int argc,char * argv[]){
int a = 10;
int rtn, rtn2;
sqlite3 *db;
char *sql, *zErMsg;
rtn = sqlite3_open("dbname.db", &db);
rtn = sqlite3_user_add(db,"username","password",2, 1);//last but one param is for number of bytes for password, last param is for weather the user is admin or not
if(rtn){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
}else{
fprintf(stderr, "Protected database successfully\n");
}
sqlite3_close(db);
return 0;
}
编译程序
//编译程序
命令1:gcc authUser.c sqlite3.o -lpthread -ldl
command2: ./a.out //输出:受保护的数据库成功
如果用户通过身份验证,则创建 c 文件以创建表
//createTable.c
#include “stdio.h”
#include “stdlib.h”
#include “sqlite3.h”
静态 int 回调(void *NotUsed,int argc,char **argv,char **azColName){
诠释我;
for(i=0; i 小于 argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
返回0;
}
int main(int argc,char * argv[]){
整数a = 10;
int rtn, rtn2;
sqlite3 *db;
字符 *sql, *zErMsg;
rtn = sqlite3_open("dbname.db", &db);
rtn = sqlite3_user_authenticate(db, "user","password",2);
如果(rtn){
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
返回(0);
}别的{
fprintf(stderr, "打开数据库成功\n");
}
sql = "创建表 newtable(id int not null 主键,name varchar(100) not null)";
//sql = "插入新表值(5, 'ishwar')";
rtn = sqlite3_exec(db, sql, 回调, 0, &zErMsg);
如果(rtn!= SQLITE_OK){
sqlite3_free(zErMsg);
}别的{
fprintf(stdout, "表创建成功\n");
//fprintf(stdout, "插入成功\n");
}
sqlite3_close(db);
返回0;
}`
编译程序 //编译程序
command1:gcc createTable.c sqlite3.o -lpthread -ldl
command2: ./a.out //输出:表创建成功
从前面的代码中,你可以看到 else 里面有两个 sql 变量和两个 fprintf,现在取消注释行并注释另一个。并运行与上面相同的命令 输出:插入成功
大功告成,试试代码,修改 sqlite3_user_authenticate 函数的值,你将无法进行这些操作,最多可以打开数据库(当你注释 sqlite3_user_authenticate 函数时,没有别的)
运行命令:./sqlite3Exe(我们在步骤 4 中创建的输出文件)
command1:.open dbname.db
command2: .tables //你应该得到错误,user_auth
谢谢(如有任何问题,请随时给我发邮件:ishwar.rimal@gmail.com)
【讨论】:
rtn = sqlite3_user_add(db,"username","password",2, 1); 得到Can't open database: no such function: sqlite_crypt 这是什么意思?
Can't open database: no such function: sqlite_crypt吗?你是怎么解决的?
要使用 SQLite 实现加密,您需要从 SQLite 作者获得一些扩展的许可。
【讨论】:
David Segleau 是 Berkeley DB 的产品管理总监。
最近的 5.1 版 Oracle Berkeley DB (5.1.7) 将 Berkeley DB 加密功能与基于 SQLite 的 SQL API 集成在一起。你可以阅读它here。
【讨论】: