【问题标题】:how can i password protect my sqlite db in C. is it possible to partition the sqlite db?如何在 C 中密码保护我的 sqlite db。是否可以对 sqlite db 进行分区?
【发布时间】:2020-08-30 11:32:21
【问题描述】:

我正在研究嵌入式系统,该设备具有带有 sqlite 数据库的 linux 内核。想知道sqlite数据库是否可以用安全分区和普通分区进行分区。

如何在linux下对sqlite数据库文件进行加密。

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    也许我回答这个问题为时已晚,但我从几天开始就面临这个问题并且无法在网上找到任何可靠的解决方案。我找到了解决方案,因此我分享它。

    //sqlite数据库认证步骤

    1. 下载 sqlite3 合并 zip 文件

    2. 解压缩文件。该文件应包含 shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h

    3. 点击find the link here

    3a。打开 userauth.c 并复制整个代码并将其粘贴到 sqlite3.c 文件的末尾。

    3b。打开 sqlite3userauth.h 并复制整个代码并将其粘贴到 sqlite3.h 文件的末尾。

    1. 为在shell中执行命令创建一个输出文件 命令: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 是可选的

    1. 构建库 5a:创建目标文件 //添加新代码后编译sqlite3.c以创建对象

    命令:gcc -o sqlite3.o -c sqlite3.c -DSQLITE_USER_AUTHENTICATION

    使用这个命令,我们生成目标文件,我们可以用它来编译我们的 c 文件。

    1. 创建 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;
       }
    2. 编译程序 //编译程序 命令1:gcc authUser.c sqlite3.o -lpthread -ldl command2: ./a.out //输出:受保护的数据库成功

    3. 如果用户通过身份验证,则创建 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;
       }
      `
    4. 编译程序 //编译程序

    command1:gcc createTable.c sqlite3.o -lpthread -ldl

    command2: ./a.out //输出:表创建成功

    1. 创建 c 文件以在表中添加值

    从前面的代码中,你可以看到 else 里面有两个 sql 变量和两个 fprintf,现在取消注释行并注释另一个。并运行与上面相同的命令 输出:插入成功

    大功告成,试试代码,修改 sqlite3_user_authenticate 函数的值,你将无法进行这些操作,最多可以打开数据库(当你注释 sqlite3_user_authenticate 函数时,没有别的)

    1. 用 shell 测试它

    运行命令:./sqlite3Exe(我们在步骤 4 中创建的输出文件)

    command1:.open dbname.db

    command2: .tables //你应该得到错误,user_auth

    谢谢(如有任何问题,请随时给我发邮件:ishwar.rimal@gmail.com)

    【讨论】:

    • 我按照代码中的所有步骤和身份验证工作,但仍然可以从 sqlite3Exe 访问数据库而无需身份验证,即在第 11 步中我得到了表。知道为什么吗?
    • @ishwar-rimal 我在rtn = sqlite3_user_add(db,"username","password",2, 1); 得到Can't open database: no such function: sqlite_crypt 这是什么意思?
    • @sotiris 你也得到Can't open database: no such function: sqlite_crypt吗?你是怎么解决的?
    【解决方案2】:

    要使用 SQLite 实现加密,您需要从 SQLite 作者获得一些扩展的许可。

    http://www.sqlite.org/support.html

    【讨论】:

      【解决方案3】:

      David Segleau 是 Berkeley DB 的产品管理总监。

      最近的 5.1 版 Oracle Berkeley DB (5.1.7) 将 Berkeley DB 加密功能与基于 SQLite 的 SQL API 集成在一起。你可以阅读它here

      【讨论】:

        猜你喜欢
        • 2014-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 2018-01-29
        • 2021-06-23
        相关资源
        最近更新 更多