2

I have a windows forms applciation that stores encrypted files to disk. At runtime, it decrypts those files and passes the resulting memorystreams to Datasets. I am using symmetric encryption with AESManaged.

There are custom functions to generate Key and IV byte arrays from a string. However I am currently hard coding the secure string that I use to generate Key and Iv, which I think defeats the purpose of encryption. I understand that the best way would be to prompt the user for a password and use that string. Is there any other way around this where I don't have to prompt the user for a password? Also I cannot use DPAPI because the encrypted data file is expected to be shared between users and computers.

4

2 回答 2

2

不可能有你的蛋糕也吃它:) 你不能存储解密密钥并使用它,也不能让别人恢复它。您唯一能做的就是通过混淆您的代码、预加密您的密钥并动态解密它(可能通过分散在几个类中的几轮解密)来明确它的位置。与其他编程学科不同,这就是乱码是件好事。

于 2012-08-15T21:38:28.320 回答
1

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

是否可以只要求您的用户一次输入密码字符串?* 如果可以,您会:

  • 使用 DPAPI 对其进行加密
  • 然后将加密的值存储在某个地方(配置文件、设置文件、注册表,无论你喜欢什么。最好是对用户安全的东西,而不是公众。)
  • 然后当你需要它时,使用 DPAPI 来检索秘密字符串
  • 使用您已经拥有的其余代码。

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

好处是即使有人得到了你的代码,再多的逆向工程也不会返回秘密字符串……因为它不存在。

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

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

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

于 2012-08-17T02:55:26.967 回答