Пароль Защитите SQLite DB. Является ли это возможным?

Мне нужно встретить новый маленький проект. Он будет содержать около 7 или 9 таблиц, самый большой из них будет расти с максимальной скоростью 1000 строк в месяц.

Я думал о SQLite как о своем db... Но мне нужно будет защитить db, если кто-то захочет изменить данные из db

Мой главный вопрос:

Возможно ли защитить паролем sqlite db, как это было бы при доступе?

Какие другие РСУБД вы бы порекомендовали для такого небольшого решения?

Разработка будет на С#, но я ищу что-то бесплатное.

Ответ 1

Вы можете защитить паролем базу данных 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();

Это не позволит любому редактору GUI просматривать ваши данные. Некоторые редакторы могут расшифровать БД, если вы введете пароль. Используемый алгоритм - RSA.

Позже, если вы хотите изменить пароль, используйте

conn.ChangePassword("new_password");

Чтобы сбросить или удалить пароль, используйте

conn.ChangePassword(String.Empty);

Ответ 2

Вы можете использовать встроенное шифрование поставщика sqlite.net(System.Data.SQLite). Подробнее см. http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx

Чтобы зашифровать существующую незашифрованную базу данных или , чтобы изменить пароль зашифрованной базы данных, откройте базу данных и затем используйте функцию ChangePassword() SQLiteConnection:

// Opens an unencrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
// Encrypts the database. The connection remains valid and usable afterwards.
cnn.ChangePassword("mypassword");

Чтобы расшифровать существующую зашифрованную базу данных, вызов ChangePassword() с паролем NULL или "":

// Opens an encrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword");
cnn.Open();
// Removes the encryption on an encrypted database.
cnn.ChangePassword(null);

Чтобы открыть существующую зашифрованную базу данных или создать новую зашифрованную базу данных, укажите пароль в ConnectionString, как показано в предыдущем примере, или вызовите функцию SetPassword(), прежде чем открывать новый SQLiteConnection. Пароли, указанные в ConnectionString, должны быть cleartext, но пароли, предоставляемые в функции SetPassword(), могут быть двоичными байтовыми массивами.

// Opens an encrypted database by calling SetPassword()
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 });
cnn.Open();
// The connection is now usable

По умолчанию ключевое слово ATTACH будет использовать тот же ключ шифрования, что и основная база данных при присоединении другого файла базы данных к существующему соединению. Чтобы изменить это поведение, вы используете модификатор KEY следующим образом:

Если вы прикрепляете зашифрованную базу данных с помощью пароля открытого текста:

// Attach to a database using a different key than the main database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY 'mypassword'", cnn);
cmd.ExecuteNonQuery();

Чтобы подключить зашифрованную базу данных с помощью двоичного пароля:

// Attach to a database encrypted with a binary key
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn);
cmd.ExecuteNonQuery();

Ответ 3

Используйте SQLCipher, это расширение для SQLite, которое обеспечивает прозрачное 256-битное шифрование AES файлов базы данных. http://sqlcipher.net

Ответ 4

Вы можете зашифровать свою базу данных SQLite с помощью дополнения SEE. Таким образом вы предотвращаете несанкционированный доступ/изменение.

Цитирование документации SQLite:

Расширение шифрования SQLite (SEE) - это расширенная версия SQLite, которая шифрует файлы базы данных с использованием 128-битного или 256-битного AES, чтобы помочь предотвратить несанкционированный доступ или изменение. Весь файл базы данных зашифрован, так что для внешнего наблюдателя файл базы данных содержит белый шум. Там нет ничего, что идентифицирует файл как базу данных SQLite.

Вы можете найти больше информации об этом дополнении по этой ссылке.

Ответ 5

Один из вариантов: VistaDB. Они позволяют защищать пароли (или даже таблицы) паролем (и, возможно, зашифрованы).

Ответ 6

для вашего вопроса о пароле, защищающем ваш sqlite db, я не думаю, что это можно сделать.

вы можете зашифровать его, хотя здесь есть информация об этом:

http://sqlcrypt.com/

это $149 за платформу.

Ответ 7

Если вы используете FluentNHibernate, вы можете использовать следующий код конфигурации:

private ISessionFactory createSessionFactory()
{
    return Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.UsingFileWithPassword(filename, password))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<DBManager>())
            .ExposeConfiguration(this.buildSchema)
            .BuildSessionFactory();    
}

private void buildSchema(Configuration config)
{
        if (filename_not_exists == true)
        {
            new SchemaExport(config).Create(false, true);
        }
}    

Метод UsingFileWithPassword (имя файла, пароль) шифрует файл базы данных и устанавливает пароль.
Он запускается только при создании нового файла базы данных. Старый, который не зашифрован, не открывается, когда он открывается с помощью этого метода.

Ответ 8

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

Ответ 9

litereplica поддерживает encryption используя шифр ChaCha, быстрее, чем AES на портативных устройствах.

Существует поддержка многих оберток для .NET.

Чтобы создать и открыть зашифрованную базу данных, мы используем URI следующим образом:

"file:/path/to/file.db?cipher=...&key=..."

Ответ 10

Зачем вам шифровать базу данных? Пользователь может легко разобрать вашу программу и выяснить ключ. Если вы шифруете его для сетевой передачи, подумайте о том, чтобы использовать PGP вместо того, чтобы сжать уровень шифрования в уровень базы данных.