安全地存储用于生成对称加密密钥的字符串

时间:2012-08-15 21:27:32

标签: c# .net vb.net

我有一个将加密文件存储到磁盘的Windows窗体应用程序。在运行时,它会解密这些文件并将生成的内存流传递给数据集。我正在使用AESManaged进行对称加密。

有一些自定义函数可以从字符串生成Key和IV字节数组。但是我目前正在编写用于生成Key和Iv的安全字符串,我认为这会破坏加密的目的。我知道最好的方法是提示用户输入密码并使用该字符串。有没有其他方法可以提示用户输入密码?此外,我无法使用DPAPI,因为加密数据文件应该在用户和计算机之间共享。

2 个答案:

答案 0 :(得分:2)

你的蛋糕也不可能吃掉它:)你不能存储解密密钥并使用它,也不能被某人恢复。你唯一能做的就是通过混淆你的代码,预先加密你的密钥并动态解密它,或者通过分散在几个类周围的几轮解密来明确它的位置。与其他编程规则不同,这就是凌乱的代码是一件好事。

答案 1 :(得分:1)

我认为你还应该考虑DPAPI;不是用于加密数据文件,而是用于加密秘密字符串。

是否可以让您的用户只输入一次秘密字符串?*如果可以,您可以:

  • 使用DPAPI对其进行加密
  • 然后将加密值存储在某处(配置文件,设置文件,注册表,您喜欢的地方。最好是保护给用户的东西,而不是一般公众。)
  • 然后在需要时,使用DPAPI检索秘密字符串
  • 使用您已有的其余代码。

由于您的数据文件仍将由具有相同密码字符串的AES加密,因此它们仍可以互换。 (在具有相同秘密字符串的人中...所以现在你刚刚创建了它,所以你的应用程序可以有多个安全组,每个组都设置自己的秘密......但这是一个切线。)

优势在于,即使有人获得了您的代码,也没有任何逆向工程会回馈秘密字符串。因为它不在那里。

请注意,这比单独使用混淆更好。通过混淆,如果攻击者获取了您的代码并且可以在他们自己的环境中运行它们,他们可以附加调试器,并在您将字符串传递给AES代码时停止。他们不必关心你用多少技巧来争夺它。他们只是在你解读它之后才看它。使用DPAPI,除非他们在用户的上下文中运行您的代码,否则这将无效。在这种情况下,无论如何都是游戏。

我不是说DPAPI是完美的,但在这种情况下,我会在单独使用混淆之前考虑它。 (您仍然可以通过混淆工具运行代码:也是一件好事,但还不够。)

*如果没有,您可以在安装/初始配置时提供吗?我在一个文件中看到了一些用明文密钥安装的地方,然后程序在第一次使用时加密它。