寻找安全,便携的密码存储方法

时间:2010-04-08 13:05:02

标签: c++ security

我正在研究应该在Win32和Linux上运行的C ++项目,该软件将被部署到小型计算机上,通常在远程位置工作 - 每台机器可能包含它自己的用户/服务-men pool

最近,我们的客户要求我们通过密码保护引入访问控制。

我们要符合以下标准:

  • 支持远程登录
  • 支持远程密码更改
  • 支持远程密码重置已编辑
  • 支持意外/有目的删除时的数据检索
  • 支持安全存储

我能够使用现有的库来满足“远程”需求,但我需要考虑的是一种存储这些数据的方法,最好以一种既可以在两个平台上运行又不会让用户使用的方式看到它/读它,加密不是这里的问题 - 这是存储方法本身。

有人可以推荐一种可以帮助我达到这些标准的安全存储方法吗?

修改

我们最初考虑使用便携式SQLite数据库,但我们感兴趣的是限制用户向数据访问数据。我们怎样才能做到这一点? (文件对用户不可见,文件不能由用户手动打开等。)

编辑2

为目前为止的回复欢呼,我们能否专注于限制文件本身访问的方法?加密不是问题。我们正在寻找的是一种隐藏和/或备份文件的方法,只允许“MyApp.exe”使用它。

到目前为止,我们还在研究备用NTFS流,但我们不确定这是否可以在Linux上运行

6 个答案:

答案 0 :(得分:6)

对于登录,您希望存储密码的迭代盐渍哈希,而不是密码本身。两种可能性是:

  • bcrypt - 改进形式的河豚,增加了工作因素
  • PBKDF2 - 来自PKCS#5规范的函数,该函数使用具有散列函数和随机盐的HMAC多次迭代密码。

但是,这不符合您的要求:

  • 支持远程密码检索

我希望你能说服客户,他们真正的意思是重置密码,在这种情况下你仍然可以使用密码哈希。

  • 支持意外/有目的删除时的数据检索

此要求难以解决,并且要求您通过将加密密码存储在数据库中来削弱安全性,以便可以撤消这些密码。为此,您应使用主密钥,使用AES / CBC或AES / CTR模式等密码随机IV加密每个密码。您应该定期重新生成主密钥并重新加密所有密码。然后,您将需要一种机制来确定何时允许密码检索(例如母亲的婚前姓名等)

要使用密码加密数据,请使用PKCS#5中的PKDF2函数从密码生成密钥。

答案 1 :(得分:2)

切勿存储密码。使用salt散列密码并存储密码。

答案 2 :(得分:2)

您可以使用SQLite数据库。因为它只是一个文件,您可以使用标准文件权限来限制访问。例如chmod 600 foo.dbs将限制对文件的访问,以便只有所有者才能读/写它。

然后正如其他人建议你在数据库中存储一个散列密码,它会相当安全。

有传言说有一个商业版的SQLite可以加密整个数据库文件。但是,这不应该替代存储散列密码,而只是散列的补充。

编辑: Here's指向商业版sqlite的链接,支持整个数据库的加密。

答案 3 :(得分:2)

我不太确定我是否完全理解你的问题。但无论如何。 如何设置用户“FooUser”(假设您的产品是“Foo”)。将文件/数据库存储在仅具有用户FooUser的读/写权限的位置。通过服务/守护进程模拟FooUser访问文件/数据库。

答案 4 :(得分:1)

首先,neve存储纯文本密码,而不是存储其哈希值。如果您希望用户数量变得足够大以致密码冲突,那么使用salt也是一个好主意。

您是否真的需要在所有系统上存储密码,还是可以使用集中式密码服务器解决方案?如果基于服务器的解决方案是可接受的,那么一个不错的challenge response方案可以在不泄露密码或其哈希的情况下对人进行身份验证。使用证书与服务器进行安全通信,使伪造更难,然后只是不允许通过适当的方式访问服务器上的密码存储,这可能是特定于操作系统的,因为只有一个,或者只是不让人们进入服务器。

答案 5 :(得分:0)

我认为正确的方法是:

  • 在内存中,你连接用户名+密码+一些cookie(比方说:megan fox)。

然后,您应用商业哈希算法。我使用.NET Framework中的SHA(System.Security.Cryptography.SHA1CryptoServiceProvider),但我确信使它在C ++中工作或者为C ++获取它是没有问题的。

因此,即使有人查看存储的哈希值,他也无法知道密码。事件如果他想比较相同的密码,他将得不到任何因为用户名+ cookie连接。 您的登录代码必须创建哈希值并将其与存储的哈希值进行比较

问题是,您无法恢复密码。但我觉得这很好。

希望这有帮助。