Как использовать SQLite Cipher в Java Swing application [duplicate]

Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.

Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.

100
задан ahmd0 14 April 2011 в 22:25
поделиться

11 ответов

SQLite имеет встроенные в шифрование шифры, которые не используются в обычном дистрибутиве, но вот несколько реализаций, которые я знаю:

  • СМОТРЕТЬ - официальная реализация.
  • wxSQLite - оболочка C ++ wxWidgets, которая также реализует шифрование SQLite.
  • SQLCipher - использует libcrypto openSSL для
  • SQLiteCrypt - Пользовательская реализация, измененный API.
  • botansqlite3 - botansqlite3 является кодеком шифрования для SQLite3, который может использовать любые алгоритмы в ботане для шифрования.
  • SQLiteCrypto - SQLiteCrypto - это простой способ шифрования базы данных Sqlite по AES-256 и SHA-256

SEE, SQLiteCrypt и SQLiteCrypto требуют покупки лицензии.

Раскрытие: я создал botansqlite3.

84
ответ дан EnemyBagJones 26 August 2018 в 18:28
поделиться

Вы можете использовать процедуры создания функций SQLite ( Руководство по PHP ):

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

При вставке данных вы можете напрямую использовать функцию шифрования и ВСТАВИТЬ зашифрованные данные, или вы может использовать пользовательскую функцию и передавать незашифрованные данные:

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

При извлечении данных вы также можете использовать функции поиска SQL:

$select_obj = $db_obj->prepare('SELECT Clear, ' .
 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
 'WHERE PlainText LIKE :searchterm');
0
ответ дан Alien426 26 August 2018 в 18:28
поделиться

Это, безусловно, возможно, и существует несколько решений с открытым исходным кодом, кроме SEE. Среди них расширение шифрования поступает с помощью wxSQLite3. См. мой ответ на аналогичный вопрос для деталей.

3
ответ дан Community 26 August 2018 в 18:28
поделиться

Для проектов, использующих Javascript, пакет, написанный tripapps , работает плавно.

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

Он работал на Mac / Windows / Linux для меня. Он компилирует SQLCipher на вашей платформе. Нет необходимости платить за лицензии от Zetetic.

0
ответ дан liangzan 26 August 2018 в 18:28
поделиться

Вы можете защитить паролем SQLite3. В первый раз перед выполнением каких-либо операций установите пароль следующим образом:

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

, а затем в следующий раз вы сможете получить к нему доступ, например

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

Это не позволит просматривать любой графический редактор Ваши данные. Позже, если вы хотите изменить пароль, используйте conn.ChangePassword("new_password"); Чтобы сбросить или удалить пароль, используйте conn.ChangePassword(String.Empty);

15
ответ дан Mangesh 26 August 2018 в 18:28
поделиться

Имейте в виду, что следующее не предназначено для замены надлежащего решения безопасности.

После игры с этим в течение четырех дней я собрал решение, используя только открытый источник Пакет System.Data.SQLite от NuGet. Я не знаю, сколько защиты это обеспечивает. Я использую его только для своего курса. Это создаст БД, зашифрует его, создаст таблицу и добавит данные.

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;
        }
    }
}

По желанию вы можете удалить conn.SetPassword(passwordBytes); и заменить его на conn.ChangePassword("password");, который нужно поместить после conn.Open(); вместо предыдущего. Тогда вам не понадобится метод GetBytes.

Чтобы расшифровать, нужно просто ввести пароль в строку подключения перед открытием вызова.

        string filename = @"C:\Programming\sqlite3\db.db";
        string passwordString = "password";
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
        conn.Open();
2
ответ дан Mike Warner 26 August 2018 в 18:28
поделиться

Вы можете получить файл sqlite3.dll с поддержкой шифрования из http://system.data.sqlite.org/ .

1 - Перейдите в http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki и загрузите один из пакетов. Версия .NET здесь не имеет значения.

2 - Извлеките SQLite.Interop.dll из пакета и переименуйте его в sqlite3.dll. Эта DLL поддерживает шифрование через пароли открытого текста или ключи шифрования.

Указанный файл является родным, а NOT требует .NET framework. Это может потребоваться Visual C ++ Runtime в зависимости от загруженного вами пакета.

UPDATE

Это пакет, который я загрузил для 32-разрядной разработки: http://system.data.sqlite.org/blobs/1.0.94.0 /sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip

7
ответ дан Mohammad Banisaeid 26 August 2018 в 18:28
поделиться

Вы всегда можете шифровать данные на стороне клиента. Обратите внимание, что не все данные должны быть зашифрованы, поскольку они имеют проблемы с производительностью.

1
ответ дан Pang 26 August 2018 в 18:28
поделиться

Да, это возможно. Если таргетинг на .Net Standard 4.6.1+ или Core, я думаю, достаточно просто получить шифрование Sqlite, чтобы использовать Microsoft.Data.Sqlite для моего ответа здесь .

0
ответ дан paulyb 26 August 2018 в 18:28
поделиться

Хорошо, SEE стоит дорого. Однако SQLite имеет встроенный интерфейс для шифрования (Pager). Это означает, что поверх существующего кода можно легко разработать некоторый механизм шифрования, не обязательно AES. Ничего действительно. См. Мой пост здесь: https://stackoverflow.com/a/49161716/9418360

Для включения шифрования Pager вам необходимо определить SQLITE_HAS_CODEC = 1. Пример кода ниже (исходный источник SQLite):

#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

Существует коммерческая версия в C language для SQLite шифрования с использованием AES256 - она ​​также может работать с PHP, но это необходимо для компиляции с расширением PHP и SQLite. Он de / шифрует файл базы данных SQLite «на лету», содержимое файла всегда зашифровывается. Очень полезно.

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

1
ответ дан q74 26 August 2018 в 18:28
поделиться

Библиотека .net System.Data.SQLite также обеспечивает шифрование.

14
ответ дан TZHX 26 August 2018 в 18:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: