Как я могу защитить паролем мою базу данных sqlite в C. Можно ли разделить базу данных sqlite? - PullRequest
0 голосов
/ 13 января 2011

Я работаю над встроенной системой, и на устройстве установлено ядро ​​linux с базой данных sqlite.Хотел узнать, можно ли разбить базу данных sqlite на безопасные и обычные разделы.

Как можно добиться шифрования для файла базы данных sqlite в linux.

Ответы [ 3 ]

0 голосов
/ 15 января 2011

для шифрования с использованием SQLite необходимо лицензировать некоторые расширения у автора SQLite.

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

0 голосов
/ 23 ноября 2016

Может быть, я слишком поздно отвечаю на этот вопрос, но я столкнулся с этой проблемой пару дней назад и не смог найти какого-либо надежного решения в Интернете. Я нашел решение, поэтому делюсь им.

// Действия по аутентификации базы данных sqlite

  1. скачать zl-файл объединения sqlite3

  2. распакуйте файл. Файл должен содержать shell.c, sqlite3.c, sqlite3.h, sqlite3ext.h

  3. нажмите найти ссылку здесь

3a. Откройте файл userauth.c, скопируйте весь код и вставьте его в конец файла sqlite3.c.

3b. Откройте файл sqlite3userauth.h, скопируйте весь код и поместите его в конец файла sqlite3.h.

  1. создать выходной файл для выполнения команды в оболочке команда: gcc -o sqlite3Exe shell.c sqlite3.c -DSQLITE_USER_AUTHENTICATION -ldl -lpthread
* * 4a тысячи двадцать восемь. Вы получите сообщение об ошибке такого файла "sqlite3userauth.h" в вашем файле shell.c: Решение: перейдите к этому файлу и закомментируйте эту строку (это потому, что вы уже включили необходимый код, когда копировали sqlite3auth.h в sqlite3.h)

4b. Проверьте выходной файл, выполнив ./sqlite3Exe (это имя, которое вы дали выходному файлу, созданному на предыдущем шаге). Вы получите консоль sqlite.

* 1 033 * 4c. Создайте базу данных и на флаге аутентификации:

команда1: .open dbname.db

команда2: .auth on

command3: .exit // команда 3 является необязательной

  1. Здание библиотеки 5а: создание объектного файла // Компиляция sqlite3.c для создания объекта после добавления нашего нового кода

команда: gcc -o sqlite3.o -c sqlite3.c -DSQLITE_USER_AUTHENTICATION

С помощью этой команды мы генерируем объектный файл, который мы можем использовать для компиляции нашего файла c.

  1. Создание файла c для аутентификации вашей базы данных:

    //authUser.c</p>
    
    <h1>include "stdio.h"</h1>
    
    <h1>include "stdlib.h"</h1>
    
    <h1>include "sqlite3.h"</h1>
    
    <p>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 команда2: ./a.out // Вывод: защищенная база данных успешно

  3. создать файл c для создания таблицы, если пользователь аутентифицирован

    //createTable.c</p>
    
    <h1>include "stdio.h"</h1>
    
    <h1>include "stdlib.h"</h1>
    
    <h1>include "sqlite3.h"</h1>
    
    <p>static int callback(void *NotUsed, int argc, char **argv, char **azColName){
       int i;
       for(i=0; i less then argc; i++){
          printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
       }
       printf("\n");
       return 0;
    }
    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_authenticate(db, "user","password",2);
        if(rtn){
            fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
              return(0);
            }else{
              fprintf(stderr, "Opened database successfully\n");
            }
        sql = "create table newtable(id int not null primary key, name varchar(100) not null)";
        //sql = "insert into newtable values(5, 'ishwar')";
        rtn = sqlite3_exec(db, sql, callback, 0, &zErMsg);
        if(rtn != SQLITE_OK){
            sqlite3_free(zErMsg);
        }else{
            fprintf(stdout, "Table created successfully \n");
            //fprintf(stdout, "inserted successfully \n");
        }
            sqlite3_close(db);
            return 0;
    }
    `
  4. компиляция программы // Компиляция программы

команда1: gcc createTable.c sqlite3.o -lpthread -ldl

command2: ./a.out // Вывод: таблица успешно создана

  1. Создать файл c для добавления значений в таблицу

из предыдущего кода, вы можете видеть две переменные sql и два fprintf внутри остальных, теперь раскомментируйте закомментированную строку и закомментируйте другую. и выполнить ту же команду, что и выше вывод: успешно вставлено

И все готово, попробуйте поэкспериментировать с кодом, измените значения функции sqlite3_user_authenticate, которую вы не сможете выполнять этими операциями, на максимуме вы сможете открыть базу данных (когда вы комментируете sqlite3_user_authenticate functon.nothing иначе)

  1. Тестирование с помощью оболочки

Запустите команду: ./sqlite3Exe (выходной файл, который мы создали на шаге 4)

команда1: .open dbname.db

command2: .tables // вы должны получить ошибку, user_auth

Спасибо (пожалуйста, не стесняйтесь, напишите мне в случае возникновения проблем: ishwar.rimal@gmail.com)

0 голосов
/ 15 января 2011

Дэвид Сигло, директор по управлению продуктами в Berkeley DB.

Последний выпуск Oracle Berkeley DB 5.1 (5.1.7) объединяет функцию шифрования Berkeley DB с API-интерфейсом SQLite на основе SQLite.Вы можете прочитать об этом здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...