2012-08-15 131 views
2

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

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

回答

2

这是不可能有你的蛋糕,也吃了它:)你不能存储解密密钥和使用它,并没有让人可以恢复。只有通过混淆代码,加密密钥并动态解密才可以做到这一点,也许可以通过围绕几个类的多轮解密来实现。与其他编程学科不同,这是凌乱的代码是一件好事。

1

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

有没有可能要问你的用户只需一次输入所述秘密串*如果你能,你会则:

  • 使用DPAPI将其加密
  • 然后存储加密值某处(配置文件,设置文件,注册表,无论你喜欢什么,最好是保护用户,而不是普通公众)。
  • 然后,当你需要它时,使用DPAPI检索秘密字符串
  • 使用其余的代码因为你已经拥有了它。

由于您的数据文件仍然会被AES以相同的秘密字符串加密,所以它们仍然可以互换。 (在具有相同秘密字符串的人群中...所以现在你已经创建了它,以便您的应用可以拥有多个安全群组,每个群组都设置自己的秘密......但这是一条切线。)

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

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

我不是说DPAPI是完美的,但在这种情况下,我会真正考虑它,然后再诉诸单独的混淆。 (您仍然可以通过模糊处理工具运行您的代码:这也是一件好事,仅仅是不够)。

*如果不是,您可以在安装/初始配置时提供吗?我已经在文件中看到了一些以纯文本形式安装密钥的地方,然后程序会在首次使用时对其进行加密。