Мне нужно встретить новый маленький проект. Он будет содержать около 7 или 9 таблиц, самый большой из них будет расти с максимальной скоростью 1000 строк в месяц.
Я думал о SQLite как о своем db... Но мне нужно будет защитить db, если кто-то захочет изменить данные из db
Мой главный вопрос:
Возможно ли защитить паролем sqlite db, как это было бы при доступе?
Какие другие РСУБД вы бы порекомендовали для такого небольшого решения?
Разработка будет на С#, но я ищу что-то бесплатное.
Вы можете защитить паролем 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);
Вы можете использовать встроенное шифрование поставщика 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();
Используйте SQLCipher, это расширение для SQLite, которое обеспечивает прозрачное 256-битное шифрование AES файлов базы данных. http://sqlcipher.net
Вы можете зашифровать вашу базу данных SQLite с помощью юниверса SEE. Таким образом вы предотвращаете несанкционированный доступ/модификацию.
Указание документации SQLite:
Расширение SQLite Encryption Extension (SEE) - это расширенная версия SQLite, которая шифрует файлы базы данных с использованием 128-битной или 256-разрядной AES, чтобы предотвратить несанкционированный доступ или модификацию. Весь файл базы данных зашифрован таким образом, что внешнему наблюдателю файл базы данных содержит белый шум. Нет ничего, что идентифицировало бы файл как базу данных SQLite.
Дополнительную информацию об этом аддоне можно найти в этой ссылке.
для вашего вопроса о пароле, защищающем ваш sqlite db, я не думаю, что это можно сделать.
вы можете зашифровать его, хотя здесь есть информация об этом:
это $149 за платформу.
Один из вариантов: VistaDB. Они позволяют защищать пароли (или даже таблицы) паролем (и, возможно, зашифрованы).
litereplica поддерживает encryption используя шифр ChaCha, быстрее, чем AES на портативных устройствах.
Существует поддержка многих оберток для .NET.
Чтобы создать и открыть зашифрованную базу данных, мы используем URI следующим образом:
"file:/path/to/file.db?cipher=...&key=..."
Я знаю, что это старый вопрос, но не просто ли было просто защитить файл на уровне ОС? Просто запретите пользователям доступ к файлу, а затем они не смогут его коснуться. Это всего лишь предположение, и я не уверен, что это идеальное решение.
Если вы используете 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 (имя файла, пароль) шифрует файл базы данных и устанавливает пароль.
Он запускается только при создании нового файла базы данных. Старый, который не зашифрован, не открывается, когда он открывается с помощью этого метода.
Зачем вам шифровать базу данных? Пользователь может легко разобрать вашу программу и выяснить ключ. Если вы шифруете его для сетевой передачи, подумайте о том, чтобы использовать PGP вместо того, чтобы сжать уровень шифрования в уровень базы данных.