Портативная база данных для хранения секретов
Я разрабатываю приложение, которое нуждается в хранении секретов в базе данных.
Мне нужна портативная база данных (например, Firebird, Sqlite и т. Д.), Где данные будут храниться в зашифрованном виде или защищены паролем, или оба...
Давайте возьмем в качестве примера, что я хочу создать менеджер паролей. Мне нужно будет хранить эти пароли в базе данных. Я привык использовать Embed Firebird, но не для секретных данных.
Другим решением является естественное использование базы данных и шифрование файла базы данных, когда я не подключен к файлу, но я не уверен в последствиях для безопасности или производительности.
Какой лучший метод вы рекомендуете?
7 ответов
Есть проект под названием sqlite-crypt. Какой должен быть ваш лучший выбор. sqlite db со всеми данными на диске в зашифрованном виде.
Вы также можете взглянуть на выпуск SQL Server Compact, который требует только DLL и будет хранить данные в одном файле, как SQLite или Access, Firebird и т. Д.
Он также имеет встроенные возможности шифрования.
Некоторые ссылки:
- Безопасность и шифрование для SQL Server Compact
- Учебники по использованию SQL Server Compact Edition (второй и третий разделы внизу страницы).
Шифрование пароля
Смотрите мой ответ на ваш другой вопрос ОС.
Встроенная поддержка REALbasic для работы с зашифрованными базами данных SQLite хорошо сработала для меня в нескольких проектах.
Я согласен с CJM, но если вы не можете писать самостоятельно, вы должны зашифровать поток во время записи и расшифровать его во время чтения. Любой опубликованный алгоритм, который несколько силен, должен обеспечивать безопасность.
Я настоятельно рекомендую вам ознакомиться с SQLCipher (полное раскрытие, я один из разработчиков!) Это бесплатная и открытая реализация прозрачного шифрования на уровне страниц для SQLite. Реализация довольно надежная, она находится в активной разработке и очень проста в использовании (условно говоря).
Я второй предложение использовать KeePass. Это отличное хранилище для конфиденциальных данных и предоставляет довольно хороший API. Вот пример того, как читать стандартную базу данных Keypass 2:
var dbpath = @"C:\path\to\passwords.kdbx";
var masterpw = "Your$uper$tr0ngMst3rP@ssw0rd";
var ioConnInfo = new IOConnectionInfo { Path = dbpath };
var compKey = new CompositeKey();
compKey.AddUserKey(new KcpPassword(masterpw));
var db = new KeePassLib.PwDatabase();
db.Open(ioConnInfo, compKey, null);
var kpdata = from entry in db.RootGroup.GetEntries(true)
select new
{
Group = entry.ParentGroup.Name,
Title = entry.Strings.ReadSafe("Title"),
Username = entry.Strings.ReadSafe("UserName"),
Password = entry.Strings.ReadSafe("Password"),
URL = entry.Strings.ReadSafe("URL"),
Notes = entry.Strings.ReadSafe("Notes")
};
db.Close();