我正在开发一个需要在数据库中存储机密的应用程序。
我需要一个便携式数据库(如Firebird,Sqlite等),其中的数据将以加密或密码保护的方式存储或同时存储...
让我们以为例创建一个密码管理器。我需要将密码存储在数据库中。我习惯使用Embed Firebird,但不习惯使用秘密数据。
另一个解决方案是自然地使用数据库并在我没有连接到文件时加密数据库文件,但我不确定安全性或性能影响。
您推荐的最佳方法是什么?
答案 0 :(得分:6)
您还可以查看SQL Server Compact版本,它只需要一个DLL,并将数据存储在一个文件中,就像SQLite或Access,Firebird等一样。
它还具有内置的加密功能。
一些参考文献:
密码加密
查看我对other question os SO的回答。
答案 1 :(得分:5)
有一个名为sqlite-crypt的项目。哪个应该是你最好的选择。 sqlite db,磁盘上的所有数据都已加密。
答案 2 :(得分:3)
答案 3 :(得分:3)
我同意CJM,但如果您自己编写死机,则应在写入时加密流并在读取时解密。任何有点强大的已发布算法都应该保证安全。
答案 4 :(得分:3)
REALbasic对加密SQLite数据库的内置支持在几个项目中对我有用。
答案 5 :(得分:3)
我强烈建议您查看SQLCipher(完全披露,我是开发人员之一!)这是针对SQLite的透明页面级加密的免费开源实现。实现相当强大,它正在积极开发中,并且它非常容易使用(相对而言)。
答案 6 :(得分:0)
我提出使用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();