21

我正在考虑制作一个小工具。该工具将做什么并不重要。重要的是,该工具需要在用户的硬盘上存储一些敏感信息。编辑:将存储的信息是用户的信息 - 我不是试图保护我自己的内容,我与应用程序一起分发。

我了解我需要对此信息进行加密。但是,我在哪里安全地存储加密密码?这是某种无限递归......

那么,有没有办法对 Windows 上的信息进行加密,并让 Windows 安全地管理密码?当我说 Windows 时,我指的是 Windows XP SP2 或更高版本。

我还应该注意,同一系统上的用户不得访问其他用户的信息(即使他们都在运行我的应用程序)。

我正在寻找 - .NET 2.0 (C#) 和本机 (C/C++) 解决方案来解决这个问题。

4

7 回答 7

23

有没有办法加密windows上的信息,让windows安全地管理密码?

CryptProtectData: http: //msdn.microsoft.com/en-us/library/windows/desktop/aa380261 (v=vs.85).aspx

从 .NET 使用:http: //msdn.microsoft.com/en-us/library/aa302402.aspx

从历史上看,受保护的存储(在 XP 中可用,在 vista+ 中只读):http: //msdn.microsoft.com/en-us/library/bb432403%28VS.85%29.aspx

于 2009-01-14T10:15:05.850 回答
6

为此,您应该考虑使用 DPAPI。它将使用基于每个用户的特殊(内部)对称密钥加密您的数据。在这种情况下,您甚至不需要询问密码,因为系统上的不同用户将分配给他们不同的密钥。

它的缺点可能是如果用户被删除/重新安装 Windows,您将无法恢复数据(我相信是这种情况,但不太确定)。在这种情况下,使用从密码派生的“自生成”密钥加密数据,并将密码存储在使用 DPAPI 加密的注册表/文件中。

于 2009-01-14T10:36:08.693 回答
4

您可以使用本机加密工具。在您的文件夹或文件上设置加密属性(从属性页,单击“高级”按钮)。然后您可以设置可以访问文件的用户(默认情况下,这仅包括文件创建者)。该解决方案的最大优势在于,从应用程序和用户的角度来看,它是完全透明的。

以编程方式执行此操作:使用 Win32 API,调用EncryptFile()要存储敏感的每用户数据的目录。从现在开始,此目录中所有新创建的文件都将被加密,并且只能由其创建者(即您的应用程序的当前用户)读取。或者,您可以FILE_ATTRIBUTE_ENCRYPTED在创建时对单个文件使用标志。您可以在文件的属性页面上从资源管理器中检查加密信息,并查看应用创建的文件是否已正确加密并仅限于其各自的用户。没有密码可以存储或使用,一切都是透明的。

如果你想对所有用户隐藏数据,那么你可以创建一个特殊的应用程序特定用户并在你的应用程序中模拟它。这与 ACL 一起,是 Windows 上用于系统服务的幸运技术。

于 2009-01-14T09:57:50.097 回答
3

您可能想查看独立存储,这是一种自动将设置和其他数据存储在每个应用程序数据上的方法。请参阅示例MSDN

这是将正常设置存储在注册表中的一种替代方法,在很多情况下是一种更好的方法......我不确定数据是如何存储到文件中的,所以你需要检查一下,你不会想要它其他用户可以访问,甚至加密。从记忆中只有应用程序。创建存储的可以打开它-但这需要检查。

编辑:

从我上次使用它时的记忆来看,一个好的方法是编写一个“设置”类来处理应用程序中的所有设置等。然后,此类具有等效的 Serialize 和 DeSerialize 方法,允许它将所有数据写入到 IsolatedStorage 文件中,或再次加载它们。

以这种方式实现它的额外优势是您可以使用属性来标记源的位,然后可以使用属性网格快速为您提供设置的用户编辑控制(属性网格在运行时使用反射操作类属性) .

于 2009-01-14T09:59:07.880 回答
0

我建议您查看 Enterprise Library Cryptography Application Block。检查这篇博文。Windows 具有用于加密数据的内置数据保护 API,但加密应用程序块使其更简单。

于 2009-01-14T10:14:26.973 回答
-4

嗯,你想要实现的正是 DRM 想要实现的。加密某些东西,然后给用户密钥(无论多么模糊)和加密。他们用 DVD 做到了。他们用蓝光做到了。他们用 iTunes 做到了。

你打算做的事情永远不会安全。一般的外行人可能不会弄明白,但任何有足够积极性的攻击者都会弄明白并发现密钥、算法并解密数据。

如果您所做的只是加密用户数据,请询问用户的密码。如果您试图保护您的内部数据免受运行应用程序的用户的影响,那么您就是 SOL

于 2009-01-14T10:31:13.960 回答
-5

Erm 对密码进行哈希处理?您不需要将真实交易存储在机器上的任何地方,只需一个散列密码(也可能加盐)。然后,当用户输入他们的密码时,您对其执行相同的操作,并将其与您存储在磁盘上的散列密码进行比较。

于 2009-01-14T10:07:19.313 回答