我正在开发一个需要将秘密存储在数据库中的应用程序。
我需要一个可移植的数据库(如Firebird,SQLite等),其中数据将被存储为加密或密码保护或同时两者都有...
让我们以创建一个密码管理器为例。我需要将这些密码存储在数据库中。我习惯使用嵌入式Firebird,但不适用于保密数据。
另一种解决方案是在没有连接文件时自然地使用数据库并加密数据库文件,但我不确定安全性或性能影响。
你推荐的最佳方法是什么?
我正在开发一个需要将秘密存储在数据库中的应用程序。
我需要一个可移植的数据库(如Firebird,SQLite等),其中数据将被存储为加密或密码保护或同时两者都有...
让我们以创建一个密码管理器为例。我需要将这些密码存储在数据库中。我习惯使用嵌入式Firebird,但不适用于保密数据。
另一种解决方案是在没有连接文件时自然地使用数据库并加密数据库文件,但我不确定安全性或性能影响。
你推荐的最佳方法是什么?
有一个叫做 sqlite-crypt 的项目,这应该是你最好的选择。sqlite 数据库中存储的所有数据都是加密的。
您也可以了解SQL Server Compact版本,它只需要一个DLL文件,并将数据存储在一个单独的文件中,就像SQLite或Access,Firebird等。
它还具有内置的加密功能。
一些参考资料:
密码加密
请看我在 SO 上回答你的其他问题的答案。
我同意CJM的观点,但如果你执意要编写自己的代码,你应该在写入时加密流,读取时解密流。任何已发布的算法都应该足够强大以保障安全。
REALbasic内置的处理加密SQLite数据库的功能在我的几个项目中运作良好。
我强烈推荐你查看 SQLCipher(全方位公开透明,我是其中一名开发者!)这是SQLite的一个免费且开源的实现,具有透明、页面级加密的功能。实现相当鲁棒,正在积极开发中,使用起来也非常容易(相对而言)。
老实说?使用TrueCrypt或KeePass。
我赞同使用KeePass的建议。它是一个非常好的存储敏感数据的地方,并且提供了一个很好的API。以下是如何读取标准KeePass 2数据库的示例:
var dbpath = @"C:path opasswords.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();