初学者加密,“主密码”问题

时间:2011-07-10 21:30:35

标签: c# aes password-encryption

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

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

现在,由于这样的程序容易发生许多不同类型的攻击,我如何安全地存储用户的“主密码”,以便有人无法抓住它?以明文形式将其存储在程序中显然不是一个好主意,因此我可以使用我选择的 另一个 密码加密/解密密码,并存储在程序中

然而,再次,如果有人访问我选择的密码来加密/解密主密码,那么他们可以再次解密主密码,这不会很好。

SO!程序如何安全地执行此操作?

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

谢谢!

5 个答案:

答案 0 :(得分:3)

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

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

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

只想添加一件事: 从根本上不可能保护那些有物理访问机器的人的“秘密”。即使对于支持本机加密方案的硬盘驱动器,这也是proven timeagain

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

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

如果这些证书足够短,那么可以使用暴力来获取它们。现在建议使用128位或更大的最小密钥长度。当然,如果限制使用普通字母,那么要测试的位数会急剧下降。如果您允许使用黑客字典中的值,那么破解的时间会进一步缩短。

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

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

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

所有这些都会增加一种情况,即如果它在计算机上,其他人可以得到它。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我会坦诚相待。保护安全专家。安全并不容易,即使是那些据称是该地区专家的人也很难做到正确。

如果你真的需要存储用户期望安全的敏感数据,那么在如何做上询问它绝对不是一个好兆头而不是可行的方法。您应该寻求专业指导或考虑使用市场上或Windows本身提供的经过良好测试的实施。

答案 3 :(得分:0)

请勿保留用户密码,请hash并确保salt。使用哈希来加密和解密文件。请注意,如果用户忘记了密码,您将无法为他们恢复密码,但您仍然可以为他们解密文件。这也意味着你的应用程序很容易受到攻击或修补的攻击,无需提供密码即可解密文件。

如果加密方法是标准的,文档化的,明显的和/或众所周知的,那么为了防止黑客只是读取哈希并使用它来解密文件本身你可以这样做:使用存储的哈希以及其他一些信息生成一个新的哈希,然后用于加密/解密文件,永远不会持久化。其他信息可以由文件大小,创建日期等组成。黑客可以使用此信息,但他们必须在知道需要之前对您的应用进行黑客/反向工程。从技术上讲,它是通过默默无闻的安全性,因为这些键隐藏在普通视图中。

答案 4 :(得分:0)

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

为什么这一切?
因为它们无法安全存放 他们无法安全加密。

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

加密文件时,要求输入密码并使用密码哈希进行加密 解密时,执行要求输入密码并尝试解密 如果它失败则那就错了。
如果没关系,那就是正确的。

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


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

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