Windows上是否有某种安全的本地存储?

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

我知道我需要encryption这些信息。 但是,在哪里安全地存储encryption密码? 这是某种无限recursion…

那么,有没有办法,在Windows上encryption信息,并有Windows安全地pipe理密码? 当我说Windows时,我的意思是Windows XP SP2或更高版本。

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

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

有没有办法,加密窗口上的信息,并有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

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

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

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

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

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

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

这是在注册表中存储常规设置的替代方法,在很多情况下是更好的选择…我不确定数据是如何存储到文件中的,所以您需要检查,您不希望它即使加密也可以访问其他用户。 从内存只有应用程序。 创建存储可以打开它 – 但需要检查。

编辑:

从上次使用这个内存的时候,一个好的方法是编写一个“设置”类来处理应用程序中的所有设置等。 这个类然后有相同的Serialize和DeSerialize方法,它允许它将所有的数据写入IsolatedStorage文件,或者再次加载它们。

以这种方式实现它的额外优点是可以使用属性来标记源的位,然后可以使用属性网格来快速给予用户对设置的编辑控制(属性网格在运行时使用反射操纵类属性) 。

我建议你看看企业库加密应用程序块。 检查这个博客文章 。 Windows具有用于加密数据的内置Data Protection API,但Crypto Application Block使其更直接。

呃,你想达到的是DRM试图达到的目标。 加密的东西,然后给用户的密钥(无论是混淆)和密码。 他们用DVD做了。 他们用蓝光做了。 他们用iTunes做了。

你打算做的事情永远不会安全。 你的平均外行人可能不会弄明白,但是任何有足够动机的攻击者都会解决这个问题,并发现密钥,算法和解密数据。

如果你正在做的是加密用户数据,然后询问用户的密码。 如果你正试图保护运行应用程序的用户的内部数据,你就是SOL

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