1

我正在编写一个程序,使用 Rijndael,将使用用户选择的密码加密和解密文件/文件夹。目前,当用户想要加密某些东西时,他们必须输入密码,该密码用于加密,当用户准备好时,解密文件/文件夹。

但是,我想要一个“主密码”,允许用户在程序的“首选项”部分中只输入一次密码,然后程序将自动使用该密码进行所有加密/解密。这样他们就不必每次想要加密/解密时都输入密码。

现在,由于这样的程序容易受到许多不同类型的攻击,我如何安全地存储用户的“主密码”,以免有人掌握它?以纯文本形式将其存储在程序中显然不是一个好主意,因此我可以使用由我选择并存储在程序中的另一个密码来加密/解密密码。

但是,同样,如果有人可以访问我选择的密码来加密/解密主密码,那么他们可以再次解密主密码,那就不好了。

所以!程序如何安全地做到这一点?

目前,我正在通过使用我自己选择的密码对其进行加密并将其存储在用户范围的设置中来保存“主密码”。如果您认为这不是一个好主意,请告诉我为什么以及您将对我目前实施的流程进行哪些更改?

谢谢!

4

5 回答 5

3

回顾一下: http ://www.redkestrel.co.uk/Articles/StoringSecrets.html

这是一篇关于你的选择的好文章。

也就是说,我认为你的用例已经很好地被 Windows 本身通过 EFS 覆盖了...... http://technet.microsoft.com/en-us/library/cc700811.aspx

只是想补充一件事:从根本上保护“秘密”不受那些可以物理访问机器的人的影响。即使对于支持本机加密方案的硬盘驱动器,这一点也已一次又一次地得到证明。

你所能做的就是让那些不知道自己在做什么的人有些困难。

根本问题是某些东西必须能够访问解密密钥。无论是机器的 BIOS、硬盘的固件,还是存储在通过 DPAPI 隐藏的某个文件夹中。这意味着唯一有效的方法是强制用户在加密/解密文件时提供必要的凭据。

如果这些凭据足够短,则可以使用蛮力来获取它们。目前的建议是使用 128 位或更大的最小密钥长度。当然,如果您仅限于使用常用字母,那么要测试的位数会急剧下降。如果你允许那些在黑客词典中发现的值,那么破解的时间会进一步缩短。

另一个问题是键盘记录器。如果安装了一个(并且它们可以对大多数用户隐藏),那么攻击者所要做的就是等待用户输入他们的解密密码并将其转发给感兴趣的一方。

哎呀,对于真正的偏执狂来说,有些设备可以仅根据您键入时键盘发出的声音来检测您键入的内容。对于其他人来说,即使机器关闭,RAM 也会在一段时间内保持状态......

那么,这意味着什么?首先,您必须要求他们在每个加密/解密请求中提供凭据。其次,他们必须确保没有安装键盘记录器。第三,凭证不容易记住。第四,计算机不能位于物理上可以访问的位置。第五,连键盘也要固定……

所有这些加起来就是这样一种情况,即如果它在计算机上,其他人就可以得到它。

于 2011-07-10T21:41:01.773 回答
0

考虑使用SecureString类将主密码存储在内存中。

于 2011-07-10T21:35:00.670 回答
0

我会坦率地说这件事。把安全留给安全专家。安全并不容易,即使对于那些本应是该领域专家的人来说,也很难做到正确。

如果您确实必须存储用户期望安全的敏感数据,那么在 SO 中询问如何做到这一点绝对不是一个好兆头,也不是要走的路。您应该寻求专业指导或考虑使用市场上或 Windows 本身提供的经过良好测试的实现。

于 2011-07-10T21:51:40.593 回答
0

不要保留用户的密码,取一个哈希值并确保对其进行加盐。使用哈希加密和解密文件。请注意,如果用户忘记了密码,您将无法为他们恢复密码,但您仍然可以为他们解密文件。这也意味着您的应用程序很容易受到黑客/修补程序的攻击,以使其在不提供密码的情况下解密文件。

如果加密方法是标准的、记录在案的、显而易见的和/或众所周知的,那么为了防止黑客仅仅读取哈希并使用它自己解密文件,您可以这样做:使用存储的哈希以及其他一些信息来生成然后您可以使用新的哈希来加密/解密文件并且永远不会保留。其他信息可能由文件的大小、创建日期等组成。黑客可以使用这些信息,但他们必须在知道他们需要它之前对您的应用程序进行破解/逆向工程。从技术上讲,它是通过默默无闻的安全性,因为这些密钥隐藏在普通视图中。

于 2011-07-10T22:10:58.007 回答
0

您知道为什么网站在您丢失密码时不会告诉您密码,而是要求您提供新密码吗?
因为他们不知道。是的,他们不知道。他们对其进行哈希处理并对其进行很好的哈希处理,因此他们只能将您输入密码的哈希值与数据库中的哈希值进行比较。

为什么这一切?
因为他们无法安全地存储它。
他们无法安全地对其进行加密。

这是一个类似的案例。
最好的方法是不使用主密码。

加密文件时,要求输入密码并使用密码的哈希值进行加密。
解密时,询问密码并尝试解密。
如果失败了,那就错了。
如果没问题,那就是正确的。

您可以在可用于检查密钥的文件内容之前添加一些(较短的)虚拟数据。


如果您尝试使用它来存储主密码,您将进入安全的无限循环,这不是一个好主意。
您将加密密码,然后加密使用的密钥,然后加密用于加密第一个密钥等的密钥。

编辑:我很抱歉这个答案令人沮丧,但你需要做的是真的不可能。

于 2011-07-10T22:25:53.123 回答