SQLite z szyfrowaniem / ochroną hasłem

Właśnie uczę się używać SQLite i byłem ciekaw czy takie jest możliwe:

  1. Szyfrowanie pliku bazy danych?

  2. Ochrona hasłem otwarcie bazy danych?

PS. Wiem, że jest to " rozszerzenie szyfrowania SQLite (patrz).", ale zgodnie z dokumentacją " SEE jest oprogramowaniem licencjonowanym...."i" koszt wieczystej licencji kodu źródłowego dla SEE wynosi 2000 USD."

Author: ahmd0, 2011-04-15

11 answers

SQLite ma wbudowane Hooki do szyfrowania, które nie są używane w normalnej dystrybucji, ale oto kilka implementacji, które znam:

  • Zobacz - oficjalne wdrożenie.
  • wxsqlite - wrapper C++ w stylu wxWidgets, który również implementuje szyfrowanie SQLite.
  • SQLCipher - używa libcrypto openssla do implementacji.
  • SQLiteCrypt - implementacja Niestandardowa, zmodyfikowane API.
  • botansqlite3 - botansqlite3 to kodek szyfrujący dla SQLite3, który może używać dowolnych algorytmów w Botanie do szyfrowania.
  • SQLiteCrypto - SQLiteCrypto jest łatwiejszym sposobem szyfrowania bazy danych Sqlite za pomocą AES-256 i SHA-256

SEE, SQLiteCrypt i sqlitecrypto wymagają zakupu licencji.

Disclosure: stworzyłem botansqlite3.

 84
Author: OliJG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 00:41:20

Możesz zabezpieczyć hasłem SQLite3 DB. Po raz pierwszy przed wykonaniem jakichkolwiek operacji Ustaw hasło w następujący sposób.

SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.open();

Następnym razem będziesz miał do niego dostęp jak

conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();

To nie pozwala żadnemu edytorowi GUI na przeglądanie danych. Później, jeśli chcesz zmienić hasło, użyj conn.ChangePassword("new_password"); Aby zresetować lub usunąć hasło, użyj conn.ChangePassword(String.Empty);

 15
Author: Mangesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-22 08:11:28

System Biblioteki.Net .Data.SQLite zapewnia również szyfrowanie.

 14
Author: Rory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 14:48:06

Można uzyskać sqlite3.dll Plik z obsługą szyfrowania z http://system.data.sqlite.org/.

1-Przejdź do http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki i pobrać jeden z pakietów. Wersja. Net nie ma tu znaczenia.

2-wyodrębnia SQLite.Interop.dll z pakietu i zmienia jego nazwę na sqlite3.dll. Ta biblioteka DLL obsługuje szyfrowanie za pomocą haseł tekstowych lub kluczy szyfrowania.

Wspomniany plik jest natywny i nie wymaga . NET framework. Może potrzebować środowiska wykonawczego Visual C++ w zależności od pobranego pakietu.

UPDATE

To jest pakiet, który pobrałem dla rozwoju 32-bitowego: http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip

 7
Author: Mohammad Banisaeid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-05 19:50:12

Jest to z pewnością możliwe i istnieje kilka rozwiązań open source oprócz SEE. Wśród nich rozszerzenie szyfrowania pochodzące z wxSQLite3. Zobacz moją odpowiedź na podobne pytanie po szczegóły.

 3
Author: Ulrich Telle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:55

Pamiętaj, że poniższe informacje nie mają na celu zastąpienia odpowiedniego rozwiązania zabezpieczającego.

Po bawieniu się tym przez cztery dni, stworzyłem rozwiązanie wykorzystujące tylko system open source.Data.Pakiet SQLite od NuGet. Nie wiem, ile to daje ochrony. Używam go tylko do własnych studiów. Spowoduje to utworzenie bazy danych, zaszyfrowanie jej, utworzenie tabeli i dodanie danych.

using System.Data.SQLite;

namespace EncryptDB
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = @"C:\Programming\sqlite3\db.db";
            string passwordString = "password";
            byte[] passwordBytes = GetBytes(passwordString);
            SQLiteConnection.CreateFile(connectionString);
            SQLiteConnection conn = new SQLiteConnection("Data Source=" + connectionString + ";Version=3;");
            conn.SetPassword(passwordBytes);
            conn.Open();
            SQLiteCommand sqlCmd = new SQLiteCommand("CREATE TABLE data(filename TEXT, filepath TEXT, filelength INTEGER, directory TEXT)", conn);
            sqlCmd.ExecuteNonQuery();
            sqlCmd = new SQLiteCommand("INSERT INTO data VALUES('name', 'path', 200, 'dir')", conn);
            sqlCmd.ExecuteNonQuery();
            conn.Close();
        }
        static byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            bytes = System.Text.Encoding.Default.GetBytes(str);
            return bytes;
        }
    }
}

Opcjonalnie można usunąć conn.SetPassword(passwordBytes); i zastąpić je conn.ChangePassword("password");, które musi być umieszczony po conn.Open(); zamiast przed. Wtedy nie będziesz potrzebował metody GetBytes.

Aby odszyfrować, wystarczy umieścić hasło w łańcuchu połączenia przed wywołaniem do otwarcia.

        string filename = @"C:\Programming\sqlite3\db.db";
        string passwordString = "password";
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
        conn.Open();
 2
Author: Mike Warner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-16 19:08:09

Zawsze możesz szyfrować dane po stronie klienta. Należy pamiętać, że nie wszystkie dane muszą być szyfrowane, ponieważ występują problemy z wydajnością.

 1
Author: Marcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-06 07:11:01

Cóż, jest drogie. Jednak SQLite ma wbudowany interfejs do szyfrowania (Pager). Oznacza to, że oprócz istniejącego kodu można w prosty sposób rozwinąć jakiś mechanizm szyfrowania, nie musi być AES. Cokolwiek. Proszę zobaczyć mój post tutaj: https://stackoverflow.com/a/49161716/9418360

Musisz zdefiniować SQLITE_HAS_CODEC=1, aby włączyć szyfrowanie pagera. Przykładowy kod poniżej (oryginalny SQLite Źródło):

#ifdef SQLITE_HAS_CODEC
/*
** This function is called by the wal module when writing page content
** into the log file.
**
** This function returns a pointer to a buffer containing the encrypted
** page content. If a malloc fails, this function may return NULL.
*/
SQLITE_PRIVATE void *sqlite3PagerCodec(PgHdr *pPg){
  void *aData = 0;
  CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData);
  return aData;
}
#endif

Istnieje wersja komercyjna w C language dla SQLite szyfrowanie przy użyciu AES256 - może również działać z PHP, ale musi być skompilowane z rozszerzeniem PHP i SQLite. De / szyfruje SQLite Plik bazy danych w locie, zawartość pliku jest zawsze szyfrowana. Bardzo przydatne.

Http://www.iqx7.com/products/sqlite-encryption

 1
Author: q74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-01 23:06:31

Możesz użyć procedur tworzenia funkcji SQLite (Podręcznik PHP):

$db_obj->sqliteCreateFunction('Encrypt', 'MyEncryptFunction', 2);
$db_obj->sqliteCreateFunction('Decrypt', 'MyDecryptFunction', 2);

Podczas wstawiania danych możesz użyć funkcji szyfrowania bezpośrednio i wstawić zaszyfrowane dane lub możesz użyć funkcji niestandardowej i przekazać niezaszyfrowane dane:

$insert_obj = $db_obj->prepare('INSERT INTO table (Clear, Encrypted) ' .
 'VALUES (:clear, Encrypt(:data, "' . $passwordhash_str . '"))');

Podczas pobierania danych możesz również użyć funkcji wyszukiwania SQL:

$select_obj = $db_obj->prepare('SELECT Clear, ' .
 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
 'WHERE PlainText LIKE :searchterm');
 0
Author: Alien426,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-22 06:35:25

Tak, to możliwe. Jeśli kierowanie. Net Standard 4.6.1 + lub Core, myślę, że dość proste, aby uzyskać szyfrowanie SQLite jest użycie Microsoft.Data.Sqlite na moją odpowiedź tutaj .

 0
Author: paulyb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-31 16:06:42

W przypadku projektów wykorzystujących Javascript, pakiet napisany przez journeyapps działa bezproblemowo.

Https://github.com/journeyapps/node-sqlcipher

To działało na Mac/Windows/Linux dla mnie. Kompiluje SQLCipher na twojej platformie. Nie ma potrzeby płacenia za licencje od Zetetic.

 0
Author: liangzan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 09:47:13