我正在开发一个需要在数据库中存储秘密的应用程序。
我需要一个便携式数据库(如 Firebird、Sqlite 等),其中数据将被加密或密码保护或两者兼而有之......
让我们以我想创建一个密码管理器为例。我需要将该密码存储在数据库中。我习惯使用 Embed Firebird,但不用于秘密数据。
另一种解决方案是在我没有连接到文件时自然使用数据库并加密数据库文件,但我不确定安全性或性能影响。
您推荐的最佳方法是什么?
我正在开发一个需要在数据库中存储秘密的应用程序。
我需要一个便携式数据库(如 Firebird、Sqlite 等),其中数据将被加密或密码保护或两者兼而有之......
让我们以我想创建一个密码管理器为例。我需要将该密码存储在数据库中。我习惯使用 Embed Firebird,但不用于秘密数据。
另一种解决方案是在我没有连接到文件时自然使用数据库并加密数据库文件,但我不确定安全性或性能影响。
您推荐的最佳方法是什么?
您还可以查看 SQL Server Compact 版本,它只需要一个 DLL 并将数据存储在单个文件中,就像 SQLite 或 Access、Firebird 等一样。
它还内置了加密功能。
一些参考资料:
密码加密
请参阅我对您的其他问题 os SO的回答。
有一个名为sqlite-crypt的项目。这应该是你最好的选择。sqlite db,磁盘上的所有数据都已加密。
我同意 CJM 的观点,但如果您对编写自己的代码一无所知,您应该在写入时加密流并在读取时对其进行解密。任何已发布的稍微强大的算法都应该保证事情的安全。
REALbasic 对加密 SQLite 数据库的内置支持在我的几个项目中运行良好。
我强烈建议您查看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();