Защита паролем БД SQLite. Является ли это возможным?

75

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

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

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

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

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

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

  • 2
    Вы можете проверить SQLiteCrypt
  • 1
    stackoverflow.com/questions/5669905/...
Показать ещё 2 комментария
Теги:

10 ответов

48
Лучший ответ

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

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

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

conn.ChangePassword("new_password");

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

conn.ChangePassword(String.Empty);
  • 0
    пожалуйста, проверьте stackoverflow.com/questions/29941169/…
  • 0
    Единственный бесплатный инструмент, который я нашел до сих пор, который будет открывать защищенные паролем базы данных, как это, SQLite2009 Pro подробно описан в этом ответе .
Показать ещё 5 комментариев
29

Вы можете использовать встроенное шифрование поставщика 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();
  • 13
    Так что мне не нравится такой ответ ... Почему бы не скопировать и вставить сюда как цитату?
  • 5
    @ user734028 Внезапно ситуация изменилась: если исходная страница будет удалена, перемещена или как-то исчезнет, ссылка будет бесполезной. Но цитирование полезной части источника будет здесь до тех пор, пока существует Stackoverflow.
Показать ещё 3 комментария
12

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

  • 0
    Как насчет скорости? Если я использую sqlcipher, это уменьшит производительность?
4

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

Указание документации SQLite:

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

Дополнительную информацию об этом аддоне можно найти в этой ссылке.

  • 6
    это расширение также является платным дополнением к sqlite.
3

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

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

http://sqlcrypt.com/

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

3

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

  • 0
    Да, базы данных зашифрованы с помощью Blowfish, и вы можете объединить провайдера с вашим приложением. Идеально подходит для небольших встроенных приложений.
  • 1
    Есть более эффективные и бесплатные способы!
Показать ещё 1 комментарий
2

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

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

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

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

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

  • 2
    Я не уверен, что это хорошее решение, потому что любой с USB-накопителем может загрузиться в другую ОС и прочитать файлы.
  • 0
    Я думаю, что это справедливо, но тогда в этом случае отключите USB. Если у кого-то есть физический доступ к вашей машине, есть много других вещей, которые можно сделать.
Показать ещё 2 комментария
2

Если вы используете 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 (имя файла, пароль) шифрует файл базы данных и устанавливает пароль.
Он запускается только при создании нового файла базы данных. Старый, который не зашифрован, не открывается, когда он открывается с помощью этого метода.

1

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

  • 5
    У пользователя может быть запрошен пароль при запуске, поэтому при разборке программы невозможно получить ключ.
  • 1
    Используйте Redgate Reflector или ILSpy.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню