用于存储秘密的便携式数据库

Posted

技术标签:

【中文标题】用于存储秘密的便携式数据库【英文标题】:Portable database for storing secrets 【发布时间】:2009-02-16 23:52:06 【问题描述】:

我正在开发一个需要在数据库中存储机密的应用程序。

我需要一个可移植的数据库(如 Firebird、Sqlite 等),其中数据将被加密存储或受密码保护或两者兼而有之......

让我们以为例,我想创建一个密码管理器。我需要将该密码存储在数据库中。我习惯于使用 Embed Firebird,但不用于秘密数据。

另一种解决方案是自然使用数据库并在我未连接到文件时加密数据库文件,但我不确定安全性或性能影响。

您推荐的最佳方法是什么?

【问题讨论】:

【参考方案1】:

您还可以查看 SQL Server Compact 版本,它只需要一个 DLL 并将数据存储在单个文件中,就像 SQLite 或 Access、Firebird 等一样。

它还内置了加密功能。

一些参考资料:

Security and Encryption for SQL Server Compact Tutorials on using SQL Server Compact Edition(页面下方的第二和第三部分)。

密码加密

查看我对您的other question os SO 的回复。

【讨论】:

【参考方案2】:

有一个名为sqlite-crypt 的项目。这应该是你最好的选择。 sqlite db,磁盘上的所有数据都已加密。

【讨论】:

【参考方案3】:

说实话?使用TrueCrypt 或KeePass。

【讨论】:

投了反对票?怎么回事?这是原始问题的完美答案。 不是我。我再次投票给你,我自己使用 Keepass 来完成其他任务 ;-) 大声笑 - 谢谢。我实际上在 TrueCrypt 卷中使用 Keepass。我的 U3 设备无法在 Server 2008 上运行,而且 U3 也不是那么安全。【参考方案4】:

我同意 CJM 的观点,但如果您对编写自己的代码一无所知,则应在写入时加密流并在读取时对其进行解密。任何已发布的强大算法都应确保安全。

【讨论】:

【参考方案5】:

REALbasic 对加密 SQLite 数据库的内置支持在我的几个项目中运行良好。

【讨论】:

【参考方案6】:

我强烈建议您查看SQLCipher(完全公开,我是开发人员之一!)它是 SQLite 透明、页面级加密的免费和开源实现。该实现相当健壮,正在积极开发中,并且非常易于使用(相对而言)。

【讨论】:

获取 Windows 二进制文件几乎是某种黑魔法...除了两个文本字符串外,没有文档说明如何在 Windows 上构建。当你关注它们时,你会发现它不能被交叉编译。 我相信我们已经让你们都理顺了 google 小组,是吗?对于在编译 Windows 二进制文件时寻求帮助的其他人,有很多信息和提示发布在:groups.google.com/group/sqlcipher【参考方案7】:

我赞同使用 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();

【讨论】:

以上是关于用于存储秘密的便携式数据库的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用程序:许多键/值的便携式数据存储

Huawei USG6530防火墙

JavaCard 存储(秘密)数据

大数据存储的秘密之分区

.Net 测试项目的用户特定和秘密数据存储在哪里?

离线便携式网络应用程序,Javascript。如何跨计算机获取持久数据库?